程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> mongodb使用aggregate、group、match實現mysql中的having(count(1))1)的功能

mongodb使用aggregate、group、match實現mysql中的having(count(1))1)的功能

編輯:DB2教程

mongodb使用aggregate、group、match實現mysql中的having(count(1))1)的功能


關系型數據庫中分組去重一般都是group by … having(count(1)>1)…賽選出來重復的記錄組,然後一條sql搞定,但是在mongodb裡面,沒有這麼方便了,需要自己寫腳本來實現,可以通過aggregate、group、match來操作處理。

1,准備錄入測試數據

db.stu.insert({cid:1,age:14,name:'gom1'});
db.stu.insert({cid:1,age:12,name:'jack2'});
db.stu.insert({cid:2,age:13,name:'Lily3'});
db.stu.insert({cid:2,age:14,name:'tony4'});
db.stu.insert({cid:2,age:9,name:'Harry5'});
db.stu.insert({cid:2,age:13,name:'Vincent6'});
db.stu.insert({cid:1,age:14,name:'bill7'});
db.stu.insert({cid:2,age:17,name:'tim8'});
db.stu.insert({cid:1,age:10,name:'bruce9'});
db.stu.insert({cid:3,age:20,name:'luxi10'});

執行窗口顯示如下:

mongos> use test;
switched to db test
mongos> 
mongos> db.stu.insert({cid:1,age:14,name:'gom1'});
mongos> db.stu.insert({cid:1,age:12,name:'jack2'});
mongos> db.stu.insert({cid:2,age:13,name:'Lily3'});
mongos> db.stu.insert({cid:2,age:14,name:'tony4'});
mongos> db.stu.insert({cid:2,age:9,name:'Harry5'});
mongos> db.stu.insert({cid:2,age:13,name:'Vincent6'});
mongos> db.stu.insert({cid:1,age:14,name:'bill7'});
mongos> db.stu.insert({cid:2,age:17,name:'tim8'});
mongos> db.stu.insert({cid:1,age:10,name:'bruce9'});
mongos> db.stu.insert({cid:3,age:20,name:'luxi10'});

2,開始分組測試,按照cid進行分組

2.1,先統計分組記錄數

var group=([
{group:{_id:"cid", max_age: {max:"age"},count: { sum: 1 }}},
{sort:{count:-1}}
])
執行窗口如下:

mongos> var group=([    
...      {$group:{_id:"$cid", max_age: {$max:"$age"},count: { $sum: 1 }}},
...      {$sort:{count:-1}}
... ])
mongos>

2.2,定義就是找出存在重復的分組,使用管道操作符match,條件是普通查詢的格式,但是作用於group的輸出結果的格式:

var match ={“match":{"count" : {"gt” : 1}}};
執行窗口如下:

mongos> var match ={"$match":{"count" : {"$gt" : 1}}};
mongos>

3 獲取數據

mongos> db.stu.aggregate(group, match);
{
    "result" : [
        {
            "_id" : 2,
            "max_age" : 17,
            "count" : 5
        },
        {
            "_id" : 1,
            "max_age" : 14,
            "count" : 4
        },
        {
            "_id" : 3,
            "max_age" : 20,
            "count" : 1
        }
    ],
    "ok" : 1
}
mongos> 

PS:這裡match無效,出來count為1的數據,沒有match成功,問題在哪裡呢?

網友Traveller的指點:
db.stu.aggregate(group, match); 看出來了嗎?你這樣調用相當於把match作為options傳進去了,當然沒有用,這種方法得不到最終的數據,因為每個管道是數組的一個元素,而group單獨是一個數組,match是一個元素。除非把它加進數組裡面,看如下寫法,
group.push(match);
db.stu.aggregate(group);

然後自己去看官網進一步研究:
http://docs.mongoing.com/manual-zh/reference/method/db.collection.aggregate.html#db.collection.aggregate,查看了aggregate介紹,aggregate的方法簽名是function (pipeline, aggregateOptions),
第一個參數是piplines,所有的對數據的判斷條件都應該在這裡面。
第二個參數是options,指定查詢時候使用的一些選項。
The options document can contain the following fields and values:包括explain、allowDiskUse、cursor,所以我傳入的match是針對group的判斷條件,所以不能作為第二個參數,而應該放到第一個參數裡面去,所以需要用到group的push功能,將match加入第一個參數裡面去才能使count>1的判斷生效。


4,使用group的push功能

mongos> group.push(match);
3
mongos> db.stu.aggregate(group);
{
    "result" : [
        {
            "_id" : 2,
            "max_age" : 17,
            "count" : 5
        },
        {
            "_id" : 1,
            "max_age" : 14,
            "count" : 4
        }
    ],
    "ok" : 1
}
mongos> 

看到已經過濾掉了count=1的記錄組了,表示push成功了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved