在嵌套数组中提取MongoDb中的特定元素

时间:2017-02-11 12:49:33

标签: mongodb

{
"_id" : 123,
"someKey" : "someValue",
"someArray" : [ 
    {
        "name" : "name1",
        "someNestedArray" : [ 
            {
                "name" : "value_1",
                "fame" : [ 
                    {
                        "goal" : "goal_1"
                    }
                ]
            }, 
            {
                "name" : "value_2",
                "fame" : [ 
                    {
                        "goal" : "goal_2"
                    }
                ]
            }
        ]
    }
]
}

我做的查询如下:

db.getCollection('city').find({"someArray.0.someNestedArray.1.fame.0.goal":"goal_2"},{"someArray.0.someNestedArray.":1})

但输出为:

{
"_id" : 123,
"someArray" : [ 
    {}
]
}

获取输出的查询是什么:

{
"fame" : [ 
                {
                    "goal" : "goal_2"
                }
            ]
}

提前致谢。 当人们不知道索引时,还要告诉如何在嵌套数组中查找值。 我做的查询指定了数组元素的位置(someArray.0.someNestedArray.1.fame.0.goal)

1 个答案:

答案 0 :(得分:2)

您可以使用以下查询:

db.test.find(
    {'someArray.someNestedArray.fame.goal':'goal_1'},
    {"someArray.someNestedArray.fame.goal":1,"_id":0}
)

你会得到这份文件:

{
    "someArray" : [ 
        {
            "someNestedArray" : [ 
                {
                    "fame" : [ 
                        {
                            "goal" : "goal_1"
                        }
                    ]
                }, 
                {
                    "fame" : [ 
                        {
                            "goal" : "goal_2"
                        }
                    ]
                }
            ]
        }
    ]
}

您也可以尝试使用$elemMatch

  

$ elemMatch运算符匹配包含数组字段的文档   至少有一个元素匹配所有指定的查询   标准。

db.test.find(
{
    'someArray':{
        $elemMatch:{
            'someNestedArray':{
                $elemMatch:{
                    'fame':{ $elemMatch: {"goal" : "goal_2" } }
                    }
                }
        }
    }
},{"someArray.someNestedArray.fame.goal":1}
);

您可以尝试使用$unwind$replaceroot返回子文档,并使用新的$filter聚合运算符在投影期间过滤数组。

希望这有帮助。