mongodb聚合函數 1.count 這個函數很好理解,和其他數據庫一樣,就是做一個count操作 select count(*) from tab1 =db.tab1.count() 以上例子很好理解,但是如果在操作中有skip,limit這種操作的話,那么count會忽略掉這些操作,必須加入一個true參數 比如:d
mongodb聚合函數
1.count
這個函數很好理解,和其他數據庫一樣,就是做一個count操作
select count(*) from tab1 =db.tab1.count()
以上例子很好理解,但是如果在操作中有skip,limit這種操作的話,那么count會忽略掉這些操作,必須加入一個true參數
比如:db.tab1.find().skip(1),limit(2).count()和db.tab1.find().count()得出的結果是一樣的
必須修改為db.tab1.find().skip(1).limit(2).count(true)
2.distinct
去重函數,這個也應該很熟悉,各種關系數據庫都有
具體操作:db.runCommand({"distinct":"collection","key":"xxxx"})=db.collections.distinct("xxxx");
3.group
select a,b,sum(c) csum from coll where active=1 group by a,b
db.coll.group( {key: { a:true, b:true },
cond: { active:1 },
reduce:function(obj,prev){ prev.csum += obj.c; },
initial: { csum: 0 }
});
參數解釋:
Key:group字段
Reduce:聚合函數,典型的有sum和count操作,包含兩個參數,當前遍歷對象以及聚合計數器
Initial:初始化計數器值
Cond:查詢條件篩選選項,如果是空,那么默認對當前collection的所有行操作
Group不能在sharding中使用,結果輸出不能多于10000個keys
舉例:
> db.mtb1.find()
{ "_id" : ObjectId("4fb4be52aa814943b788095c"), "name" : "aaa", "score" : 77 }
{ "_id" : ObjectId("4fb4be5caa814943b788095d"), "name" : "bbb", "score" : 79 }
{ "_id" : ObjectId("4fb4be61aa814943b788095e"), "name" : "ccc", "score" : 79 }
{ "_id" : ObjectId("4fb4be69aa814943b788095f"), "name" : "ddd", "score" : 79 }
{ "_id" : ObjectId("4fb4be74aa814943b7880960"), "name" : "eee", "score" : 100 }
{ "_id" : ObjectId("4fb4be7aaa814943b7880961"), "name" : "fff", "score" : 100 }
{ "_id" : ObjectId("4fb4be82aa814943b7880962"), "name" : "ggg", "score" : 100 }
{ "_id" : ObjectId("4fb4be9eaa814943b7880963"), "name" : "hhh", "score" : 200}
> db.mtb1.group(
... {key:{score:true},
... reduce:function(obj,prev){prev.count++;},
... initial:{count:0}
... });
[
{
"score" : 77,
"count" : 1
},
{
"score" : 79,
"count" : 3
},
{
"score" : 100,
"count" : 3
},
{
"score" : 200,
"count" : 1
}
]
一個簡單的例子,應該很明白了。其實這里group還是建立在reduce上面
4.map/reduce
這個工具的功能可以實現以上三種任何一種,它是分兩步完成,先做map,再reduce,map首先對數據進行分解映射,map執行完,緊接著會進行reduce,map后會的到key-values,像{key:[value1,value2,value3...]},然后通過reduce處理后得到key-value,也就是單一的值。
語法:
db.runCommand(
{ mapreduce :
map :
reduce :
[, query :
[, sort :
[, limit :
[, out :
[, keeptemp:
[, finalize :
[, scope :
[, verbose : true]
}
);
query是很常用的,它用來在map階段過濾查詢條件的以限定MapReduce操作的記錄范圍,sort和limit集合query使用。
out指定輸出結果的collections名稱
Keeptemp 布爾型,默認是false,如果是true那么生成的collection是永久存在的,如果是false,那么在客戶端連接關閉后,會自動刪除生成的collection
Finalize一般用來計算平均數,裁剪數組,清除多余信息
query是很常用的,它用來在map階段過濾查詢條件的以限定MapReduce操作的記錄范圍,sort和limit集合query使用。
out指定輸出結果的collections名稱
Keeptemp 布爾型,默認是false,如果是true那么生成的collection是永久存在的,如果是false,那么在客戶端連接關閉后,會自動刪除生成的collection
Finalize一般用來計算平均數,裁剪數組,清除多余信息
{ result :
counts : {
input :
emit :
output :
} ,
timeMillis :
ok : <1_if_ok>,
[, err :
}
result:儲存結果的collection的名字
input:滿足條件的數據行數
emit:emit調用次數,也就是所有集合中的數據總量
ouput:返回結果條數
timeMillis:執行時間,毫秒為單位
ok:是否成功,成功為1
err:如果失敗,這里可以有失敗原因
給出官方文檔的一個例子:
$ ./mongo
> db.things.insert( { _id : 1, tags : ['dog', 'cat'] } );
> db.things.insert( { _id : 2, tags : ['cat'] } );
> db.things.insert( { _id : 3, tags : ['mouse', 'cat', 'dog'] } );
> db.things.insert( { _id : 4, tags : [] } );
> // map function
> m = function(){
... this.tags.forEach(
... function(z){
... emit( z , { count : 1 } );
... }
... );
...};
> // reduce function
> r = function( key , values ){
... var total = 0;
... for ( var i=0; i ... total += values[i].count; ... return { count : total }; ...}; > res = db.things.mapReduce(m,r); > res {"timeMillis.emit" : 9 , "result" : "mr.things.1254430454.3" , "numObjects" : 4 , "timeMillis" : 9 , "errmsg" : "" , "ok" : 0} > db[res.result].find() {"_id" : "cat" , "value" : {"count" : 3}} {"_id" : "dog" , "value" : {"count" : 2}} {"_id" : "mouse" , "value" : {"count" : 1}} > db[res.result].drop() 聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com