【问题标题】:Mongodb Aggregate nested subdocumentsMongodb 聚合嵌套子文档
【发布时间】:2015-02-08 06:59:57
【问题描述】:

有文件列表

[
{
    "__v" : 21,
    "_id" : ObjectId("546330dbb8926d177052e9ff"),
    "code" : "WfvCc",
    "description" : "",
    "elements" : [ 
        {
            "_id" : ObjectId("546471f61e13b76a0b20ccaf"),
            "comments" : [],
            "meta" : {
                "createdBy" : "545ab39ef1b0c88a695fcf8d",
                "modifiedAt" : "1415868918045",
                "createdAt" : "1415868918045"
            },
            "title" : "awesome title",
            "votes" : {
                "count" : 3,
                "meta" : [ 
                    {
                        "createdBy" : "545ab39ef1b0c88a695fcf8d",
                        "_id" : ObjectId("546473831e13b76a0b20ccb7"),
                        "createdAt" : "1415869315618"
                    }, 
                    {
                        "createdBy" : "545aaddcf1b0c88a695fcf84",
                        "_id" : ObjectId("546473d71e13b76a0b20ccbc"),
                        "createdAt" : "1415869399584"
                    }, 
                    {
                        "createdBy" : "5461c0e2c9c39a192c44226c",
                        "_id" : ObjectId("546474041e13b76a0b20ccbe"),
                        "createdAt" : "1415869444056"
                    }
                ]
            }
        }
    ]
},
{
    "__v" : 21,
    "_id" : ObjectId("546330dbb8926d177052e9ff"),
    "code" : "WfvCc",
    "description" : "",
    "elements" : [ 
        {
            "_id" : ObjectId("546471f61e13b76a0b20ccaf"),
            "comments" : [],
            "meta" : {
                "createdBy" : "545ab39ef1b0c88a695fcf8d",
                "modifiedAt" : "1415868918045",
                "createdAt" : "1415868918045"
            },
            "title" : "awesome title",
            "votes" : {
                "count" : 3,
                "meta" : [ 
                    {
                        "createdBy" : "545ab39ef1b0c88a695fcf8d",
                        "_id" : ObjectId("546473831e13b76a0b20ccb7"),
                        "createdAt" : "1415869315618"
                    }, 
                    {
                        "createdBy" : "545aaddcf1b0c88a695fcf84",
                        "_id" : ObjectId("546473d71e13b76a0b20ccbc"),
                        "createdAt" : "1415869399584"
                    }, 
                    {
                        "createdBy" : "5461c0e2c9c39a192c44226c",
                        "_id" : ObjectId("546474041e13b76a0b20ccbe"),
                        "createdAt" : "1415869444056"
                    }
                ]
            }
        }
    ]
}
]

我想汇总用户列表。 elements.votes.meta.createdBy 跨文档并计算整个文档的出现总数。 *请注意,elements.votes.meta.createdBy 在每个文档中都是唯一的,因此理论上这应该更简单。

到目前为止,我得到了一个查询:

db.sessions.aggregate(
  { $project: { 
      meta: "$elements.votes.meta"
  }},
  { $unwind: "$meta" },
  { $group: {
      _id: "voters",
      voters: {
          $addToSet: "$meta.createdBy"
      }
  }}
)

只是为了再次完全陷入困境。我知道我需要一个双重分组,只是似乎无法弄清楚。任何帮助表示赞赏。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    首先,您应该获取每个“用户”的总数。 (即 { $group: {_id: '$user', count: {'$sum': 1} }}

    然后只需按 null 分组以创建包含结果的文档,添加每个用户以设置并将结果从第一次分组推送到数组字段。 (第二组)

    db.test5.aggregate(
      { $unwind: "$elements" },
      { $unwind: "$elements.votes.meta" },
      { $project: {_id: '$_id', user: '$elements.votes.meta.createdBy'} },
      { $group: {_id: '$user', count: {'$sum': 1} }},
      { $group: {
            _id: null, 
            users: {$addToSet: '$_id'}, 
            occurances: {$push: {'user': '$_id', count: '$count'}}
            }
       }
    )
    

    结果:

    {
        "result" : [ 
            {
                "_id" : null,
                "users" : [ 
                    "545ab39ef1b0c88a695fcf8d", 
                    "545aaddcf1b0c88a695fcf84", 
                    "5461c0e2c9c39a192c44226c"
                ],
                "occurances" : [ 
                    {
                        "user" : "5461c0e2c9c39a192c44226c",
                        "count" : 2
                    }, 
                    {
                        "user" : "545aaddcf1b0c88a695fcf84",
                        "count" : 2
                    }, 
                    {
                        "user" : "545ab39ef1b0c88a695fcf8d",
                        "count" : 2
                    }
                ]
            }
        ],
        "ok" : 1
    }
    

    【讨论】:

    • 太棒了,稍作修改,这正是我想要的。关键是把$unwind 加倍。干杯!
    猜你喜欢
    • 2020-03-08
    • 2014-03-04
    • 1970-01-01
    • 2019-02-16
    • 2020-12-31
    • 2021-03-13
    • 2013-09-18
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多