如何访问MongoDB中的第N级子文档

时间:2018-07-17 07:41:47

标签: mongodb

{
"_id" : ObjectId("5b4d815ad85250f4e502d142"),
"company_Name" : "Rishabh Instruments",
"spaces" : [ 
    {
        "_id" : "11",
        "name" : "Trishala",
        "spaces" : [ 
            {
                "_id" : "111",
                "name" : "ESL"
            }, 
            {
                "_id" : "112",
                "name" : "IS"
            }
        ]
    }, 
    {
        "_id" : "12",
        "name" : "Riddhi",
        "spaces" : [ 
            {}
        ]
    }, 
    {
        "name" : "XYZ",
        "spaces" : [ 
            {}
        ]
    }
]

}

这是我在Mongo DB中的文档结构,它可能具有高达N级的子文档,因此现在我想访问以ESL和IS命名的文档。所以我该怎么做才能通过下面的查询升至第二级

    db.space.aggregate([
    {$match: {company_Name: 'Rishabh Instruments'}},
    {$unwind: '$spaces'},
    {$match: {'spaces.name': 'Trishala'}}
   // {$unwind: '$spaces'},
   // {$match: {'spaces.name': 'ESL'}}

])

但是如果我取消注释这两行,那么它不会返回任何东西 所以任何人都可以指导我或提供任何提示。

2 个答案:

答案 0 :(得分:0)

我尝试了以下解决方案,并且按预期工作,我可以通过链接密钥进入第N级,因为我的情况是密钥为空格

db.space.aggregate([
    {$match: {company_Name: 'Rishabh Instruments'}},
    {$unwind: '$spaces'},
    {$match: {'spaces.name': 'Trishala'}},
    {$unwind: '$spaces.spaces'},
    {$match: {'spaces.spaces.name': 'ESL'}}

]) 

答案 1 :(得分:0)

尝试使用带有投影的汇总查询来匹配您提供的示例输出:

db.space.aggregate([
    {$match: {company_Name: 'Rishabh Instruments'}},
    {$unwind: '$spaces'},
    {$match: {'spaces.name': 'Trishala'}},
    {$unwind: '$spaces.spaces'},
    {$match: {$or : [{'spaces.spaces.name': 'ESL'},{'spaces.spaces.name': 'IS'}]}},
    {$project : {_id : 0, _id :'$spaces.spaces._id', name:'$spaces.spaces.name'}}
])

输出:

{ "_id" : "111", "name" : "ESL" }
{ "_id" : "112", "name" : "IS" }