MongoDB學習筆記——聚合操作之group,distinct,count


單獨的聚合命令(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兩者必須有一個
  • initialreduce中使用變量的初始化
  • 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM