單獨的聚合命令(group,distinct,count)
單獨聚合命令 比aggregate性能低,比Map-reduce靈活度低;但是可以節省幾行javascript代碼,后面那句話我自己加的,哈哈哈~
count()方法可以查詢統計符合條件的集合的總數
db.COLLECTION_NAME.count(<query>) // 此方法等價於 db.COLLECTION_NAME.find(<query>).count()
在分布式集合中,會出現計算錯誤的情況,這個時候推薦使用aggregate;
distinct命令可以找出給定鍵的所有去重之后的值。使用時也必須指定集合和鍵
db.runCommand({ distinct: "<collection>", key: "<field>", query: <query> }) //此方法等價於 db.collection.distinct(field, query)
參數說明:
-
collection :要查詢的集合的名稱
-
key:需要去重的字段的名稱
-
query :可選參數, 指明查詢條件,相當於SQL中的where語句
Group操作:mongodb2.2版本對於返回數據最多只包涵20000個元素,最多支持20000獨立分組;對於超過20000的獨立分組建議采用mapreduce;
db.runCommand({
group:
{
ns: <namespace>,
key: <key>,
$reduce: <reduce function>,
$keyf: <key function>,
cond: <query>,
finalize: <finalize function>
}
}) //該方法等價於 db.collection.group({ key, reduce, initial [, keyf] [, cond] [, finalize] })
參數說明
-
ns:集合名稱
-
key:用來分組文檔的字段。和keyf兩者必須有一個
-
keyf:可以接受一個javascript函數。用來動態的確定分組文檔的字段。和key兩者必須有一個
-
initial:reduce中使用變量的初始化
-
reduce:執行的reduce函數。函數需要返回值。
-
cond:執行過濾的條件。
-
finallize:在reduce執行完成,結果集返回之前對結果集最終執行的函數。可選的。
插入測試數據
for(var i=1; i<20; i++){
var num=i%6;
db.test.insert({_id:i,name:"user_"+i,age:num});
}
普通分組查詢
db.test.group({
key:{age:true},
initial:{num:0},
$reduce:function(doc,prev){
prev.num++
}
});
db.runCommand({
group: {
ns: "test",
key: {
age: true
},
initial: {
num: 0
},
$reduce: function(doc,
prev){
prev.num++
}
}
});
篩選后分組查詢
db.test.group({
key: {
age: true
},
initial: {
num: 0
},
$reduce: function(doc,
prev){
prev.num++
},
condition: {
age: {
$gt: 2
}
}
});
db.runCommand({
group: {
ns: "test",
key: {
age: true
},
initial: {
num: 0
},
$reduce: function(doc,
prev){
prev.num++
},
condition: {
age: {
$gt: 2
}
}
}
});
group聯合$where查詢
db.test.group({
key: {
age: true
},
initial: {
num: 0
},
$reduce: function(doc,
prev){
prev.num++
},
condition: {
$where: function(){
returnthis.age>2;
}
}
});
使用函數返回值分組
//注意,$keyf指定的函數一定要返回一個對象
db.test.group({
$keyf: function(doc){
return{
age: doc.age
};
},
initial: {
num: 0
},
$reduce: function(doc,
prev){
prev.num++
}
});
db.runCommand({
group: {
ns: "test",
$keyf: function(doc){
return{
age: doc.age
};
},
initial: {
num: 0
},
$reduce: function(doc,
prev){
prev.num++
}
}
});
使用終結器
db.test.group({
$keyf: function(doc){
return{
age: doc.age
};
},
initial: {
num: 0
},
$reduce: function(doc,
prev){
prev.num++
},
finalize: function(doc){
doc.count=doc.num;deletedoc.num;
}
});
db.runCommand({
group: {
ns: "test",
$keyf: function(doc){
return{
age: doc.age
};
},
initial: {
num: 0
},
$reduce: function(doc,
prev){
prev.num++
},
finalize: function(doc){
doc.count=doc.num;deletedoc.num;
}
}
});
關系型數據庫與MongoDB數據庫在一些術語上的對
MongoDB操作符 |
范例 |
關系型數據庫(mysql) |
關系型數據庫范例 |
count() |
count({"key":value})或 find({"key":value}).count() |
count |
select count(1) from table where key=value |
distinct |
db.runCommand({"distinct":collectionname, "key":"key1",{'key2':value2}}) 或 db.collectionname.distinct("key1",{key2:value2}) |
distinct |
select distinct key1 from table where key2=value2 |
group |
db.test.group({ key:{age:true}, initial:{num:0}, $reduce:function(doc,prev){ prev.num++ }, condition:{$where:function(){ return this.age>2; } } }); |
group by |
select count(1),key1 from table where key2=1 group by key1 |