Mongodb grouby by和sum并获得媒体

时间:2016-02-23 15:11:31

标签: mongodb mongodb-query aggregation-framework

我的数据库中有这个集合:

{ "IdUser" : "1", "IdItem" : "1" },
{ "IdUser" : "1", "IdItem" : "2" },
{ "IdUser" : "1", "IdItem" : "3" },
{ "IdUser" : "2", "IdItem" : "4" },
{ "IdUser" : "2", "IdItem" : "5" },
{ "IdUser" : "4", "IdItem" : "6" },
{ "IdUser" : "5", "IdItem" : "7" }

如何获得此结果:

  

拥有一件商品的用户:2

     

有两个项目的用户:1

     

有三个项目的用户:1

2 个答案:

答案 0 :(得分:2)

您需要先IdUser IdUser文档,然后使用$group累加器运算符计算每个db.items.aggregate([ { "$group": { "_id": "$IdUser", "count": { "$sum": 1 } }}, { "$group": { "_id": "$count", "nUsers": { "$sum": 1 } }} ]) 出现在您的集合中的时间。这允许您在下一阶段按“计数”对文档进行分组,并返回具有相同数量“项目”的“用户”计数。

var progress = document.createElement('div');
var progressBar = document.createElement('div');

progress.appendChild(progressBar);

document.body.appendChild(progress);

var manager = new THREE.LoadingManager();
manager.onProgress = function ( item, loaded, total ) {
  progressBar.style.width = (loaded / total * 100) + '%';
};

function addRandomPlaceHoldItImage(){
  var r = Math.round(Math.random() * 4000);
  new THREE.ImageLoader(manager).load('http://placehold.it/' + r + 'x' + r);
}

for(var i = 0; i < 10; i++) addRandomPlaceHoldItImage();

答案 1 :(得分:1)

使用 aggregate( )方法会为您提供所需的结果,但输出文档的不同之处在于,您有两个不同的字段值,而不是键/值对显示用户数量及其各自的数量 项目数。以下聚合管道解释了这一点:

db.collection.aggregate([
    {
        "$group": {
            "_id": "$IdUser",
            "count": { 
                "$sum": { "$cond": [{ "$gt": [ "$IdItem", null ] }, 1, 0 ] } 
            }            
        }
    },
    {
        "$group": {
            "_id": "$count",
            "users": { "$push": "$_id" }            
        }
    },
    {
        "$project": {
            "_id": 0, 
            "number_of_items": "$_id", 
            "number_of_users": { "$size": "$users" } 
        }
    }
])

在上文中,您 $group 用户密钥获取所有文件,并考虑到可能没有商品字段的文件,这些文件会在骨料。然后需要进一步执行 $group 操作,然后以数组的形式获取每个计数的用户。

管道中的最后一步 $project 用于重塑最终输出,以便您获得以下输出(随问题提供示例文档):

{ "number_of_items" : 1, "number_of_users" : 2 }
{ "number_of_items" : 3, "number_of_users" : 1 }
{ "number_of_items" : 2, "number_of_users" : 1 }