1. 程式人生 > >MongoDB,分組,聚合

MongoDB,分組,聚合

管道在Unix和Linux中一般用於將當前命令的輸出結果作為下一個命令的引數。
MongoDB的聚合管道將MongoDB文件在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操作是可以重複的。

每一個操作符(集合)都會接受一連串的文件,對這些文件做一些型別轉換,最後將轉換後的文件作為結果傳遞給下一個操作符,對於最後一個操作符,是將結果返回給客戶端

//分組(這裡制定了分組欄位 $+欄位名)
//這裡可以理解為,吧lastModifyByUserCode 當作唯一標識 _id,欄位count 用 $sum 計算 同一個lastModifyByUserCode出現次數

db.test.aggregate({'$group':{'_id':'$lastModifyByUserCode','count':{'$sum':1}}})

//根據多個欄位分組

db.test.aggregate({$group:{_id:{lastModifyByUserCode:'$lastModifyByUserCode',createTime:'$createTime'}}})

//顯示其他欄位(必須使用聚合[$sum,$avg,$first,$last,$max,$min,$push,$addToSet,$stdDevPop,$stdDevSamp])

db.test.aggregate({'$group':{'_id':'$lastModifyByUserCode','count':{'$sum':1},'createTime':{'$first':"$createTime"}}})

//投射,可以對欄位重新命名,可以建立欄位副本(注意:在對欄位重新命名時,MongoDB並不會記錄欄位的歷史名稱,因此如果在"orginalfieldname"欄位上有一個索引,聚合框架無法在下面的排序操作中使用這個索引,所以,應該儘量在修改欄位名稱之前使用索引)

db.test.aggregate({$project:{createTime2:'$createTime',createTime3:'$createTime',_id:0}})

$match 用於對文件集合進行篩選,支援find一樣的篩選條件,不能在$match中使用地理空間操作符,(儘量把$match放在多個聚合中的第一個,這樣可以有效利用索引)

而且根據官方文件,如果在$match使用了全文索引,後面跟著的聚合就不用再使用$text