Mongodb group by和sum并获得Map的媒体

时间:2016-06-06 08:21:43

标签: 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" }

用户

{ "_id" : "1", "DateRegister" : ISODate("2016-03-29T22:00:38.764+0000") },
{ "_id" : "2", "DateRegister" : ISODate("2014-03-29T22:00:38.764+0000") },
{ "_id" : "2", "DateRegister" : ISODate("2015-02-29T22:00:38.764+0000") },
{ "_id" : "4", "DateRegister" : ISODate("2013-01-29T22:00:38.764+0000") },
{ "_id" : "5", "DateRegister" : ISODate("2016-04-29T22:00:38.764+0000") }

我如何获得此结果,但在 2015 后注册的用户已过滤:

  

拥有一件商品的用户:2

     

有两个项目的用户:1

     

有三个项目的用户:1

我已尝试过,但我不知道如何过滤...谢谢!

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" } 
        }
    }
])

1 个答案:

答案 0 :(得分:2)

您可能希望使用 $lookup 运算符来执行items集合与users集合的连接,然后执行 $match 在管理主分组操作之前过滤 if (event.url.match('openccard')) { var customerId = event.url.split('openccard-')[1]; var evt = document.createEvent("Event"); evt.initEvent("openccard",true,true); evt.customerId = customerId; document.dispatchEvent(evt); } 字段。

遵循此示例+此处文档中的链接将为您提供一个想法:

DateRegistered

如果您的MongoDB服务器不支持 $lookup 运算符,您将需要一种解决方法,您可以在其中拆分不同集合上的操作,即

  • 获取与给定日期范围条件匹配的用户ID列表,可以使用带有日期查询选项的用户集合上的 distinct() 方法完成此操作。
  • $match 运算符初始步骤中的项目集合聚合管道中使用该列表。

以下内容证明了这一点:

db.items.aggregate([
    {
        "$lookup": {
            "from": "users",
            "localField": "IdUser",
            "foreignField": "_id",
            "as": "user"
        }
    },
    { "$match": { "user.DateRegister": { "$gt": new Date(2015, 11, 31) } } },
    {
        "$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" } 
        }
    }
])