2017-02-11 88 views
2
{ 
"_id" : 123, 
"someKey" : "someValue", 
"someArray" : [ 
    { 
     "name" : "name1", 
     "someNestedArray" : [ 
      { 
       "name" : "value_1", 
       "fame" : [ 
        { 
         "goal" : "goal_1" 
        } 
       ] 
      }, 
      { 
       "name" : "value_2", 
       "fame" : [ 
        { 
         "goal" : "goal_2" 
        } 
       ] 
      } 
     ] 
    } 
] 
} 

我做了查询,如:提取特定元素MongoDB中的嵌套数组

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)

+0

检查[mongodb位置运算符](https://docs.mongodb.com/manual/reference/operator/update/positional/) –

+0

位置$运算符不能用于遍历多个数组的查询,例如查询嵌套在其他数组中的遍历数组的查询,因为替换$ placeholder是单个值。 –

回答

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 OPER ator将包含数组字段 的文档与至少一个匹配所有指定查询条件的元素进行匹配。

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

你可以尝试使用$unwind$replaceroot返回子文档,并使用新的$filter聚集操作投影期间过滤数组。

希望这会有所帮助。