【问题标题】:project all objects that contain a certain field in an array mongodb在数组mongodb中投影包含某个字段的所有对象
【发布时间】:2014-05-12 20:40:07
【问题描述】:

对我来说还有一个 mongodb 问题:

我正在尝试为所有用户在我的 mongodb 中对数组中的一些项目进行 $group:这是一个文档

        {
         name: "Foo Bar",
         groups:[{
              groupName: "Group D",
              score:[2,1]
            },
            {
              groupName: "Group D",
              score:[3,0]
            },
            {
              groupName: "Group C",
              score:[2,2]
            }]

    }

所有用户的结构都相同,只是分数发生了变化。 我想检查所有用户,并返回他们所有的“D组”对象,并与他们的名字组合在一起——我的解决方案的结果需要如下所示:

 result:
    [{name:"Foo Bar", 
       groups:[{
                      groupName: "Group D",
                      score:[2,1]
               },
               {
                      groupName: "Group D",
                      score:[3,0]
               }]
   },{//*More users*//}]

所以我知道我需要 $group,可能还有 $all 、 $aggregate 、 $wind ...

但是我看到的所有示例都是针对查询部分而不是 find() 的投影部分。我需要从所有用户那里获取此信息,但我不想处理我的所有用户并开始扫描 mongodb 之外的信息......换句话说 - 复杂的投影,是否可能?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    相当简单:

    db.collection.aggregate([
        // Unwind the array
        { "$unwind": "$groups" },
    
        // Match the elements you want
        { "$match": { "groups.groupName": "Group D" } },
    
        // Group back to the original form
        { "$group": {
            "_id": "$_id",
            "name": { "$first": "$name" },
            "groups": { "$push": "$groups" }
        }}
    ])
    

    应该这样做。

    【讨论】:

    • 谢谢 - 你能解释一下 $first 在这个查询中做什么 - 因为在源代码中它说 - “只有在 $group 遵循 $sort 操作时才使用 $first 。否则,这个结果操作是不可预测的。”
    • @orepor 通常是这样,但是由于这是按_id 分组并且不遍历文档,因此没有什么可排序的。因此,这只是获取文档中的现有字段,并以与原始文档相同的结构将其呈现在结果中。每个文档只有 一个 字段,因此 $first 是合适的。
    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2014-05-18
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多