MongoDB, 选择嵌套数组字段

7

我有一个集合,其中的文档有嵌套数组,我想选择只包含低级数组的部分,这可能吗?

我尝试过这个方法,但它不起作用:

db.collection.find({},{'family.children.$.toys' :1})

文档示例

   {
    "id":1000,
    "name": "Bob",
    "surname":"The Builder",
    "family":{
        "size":2,
        "status": "happy",
        "children":[{
            "name":"Jim",
            "school": "St. Mary",
            "toys":[{
                "name":"Lego"
            },
            {
                "name":"Playstation"
            }]
        },
        {
            "name":"Kate",
            "school": "St. Mary",
            "toys":[{
                "name":"Xbox"
            },
            {
                "name":"Barbie"
            }]
        }
        ]
    }
}

期望结果(仅提取玩具列表):
{
_id:1000,
family:{
    childrens:[{
        toys:[{
            name:Lego
        },
        {
            name:Playstation
        }]
    },
    {
        toys:[{
            name:Xbox,
        },
        {
            name:Barbie
        }]
    }
    ]
}}

一种方法是使用聚合框架。我认为这实际上是一个典型的用例。下面的帖子可能会更多地指导您朝着可能的解决方案方向前进:https://dev59.com/WmUp5IYBdhLWcg3wrZBp - Matthias
1
你能不能至少试着发布有效的JSON数据? - styvane
他只需要聚合框架中的$project,这也可以在find()中使用。 - Cetin Basoz
@user3100115 现在应该没问题了。 - MQ87
2个回答

14
db.collection.find({},{'id':1, 'family.children.toys' :1, '_id':0})

样例输出:

{
        "id" : 1000,
        "family" : {
                "children" : [
                        {
                                "toys" : [
                                        {
                                                "name" : "Lego"
                                        },
                                        {
                                                "name" : "Playstation"
                                        }
                                ]
                        },
                        {
                                "toys" : [
                                        {
                                                "name" : "Xbox"
                                        },
                                        {
                                                "name" : "Barbie"
                                        }
                                ]
                        }
                ]
        }
}

这个方法很有效,而且非常简单!我确信我之前已经尝试过它了,所以我才发了那个问题 :D。谢谢 - MQ87
这个可以实现。 我怎样在每个“玩具”的“名称”旁边添加一个名为“_id”的字段? - undefined

2
你也可以使用聚合来实现这一点。你可以使用 $map 运算符仅返回 toys 字段。
db.collection.aggregate([{ 
    "$project": { 
        "family.childrens": { 
            "$map": { 
                "input": "$family.children",
                "as": "f", 
                "in": { "toys": "$$f.toys" }
            }
        }
     }}
 ])

采用被接受的答案看起来更直接,是否有性能方面的原因必须使用这个聚合框架版本? - MQ87
2
@MQ87 不,接受的答案是在这里做这个的最佳方式(我甚至点赞了这个答案)。我添加了这个答案,这样你就知道有时候聚合是唯一的方法。 - styvane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接