2015-05-31 34 views
0

这里我有一个示例嵌套数组。我对在深度嵌套的这个集合上编写适当的查询存在问题。从MongoDB的嵌套数组中找到单个字段

{ 
"productUUID" : "craft001", 
"providers": [ 
{ 
    "providerUUID": "prov001", 
    "orgs": [ 
    { 
     "orgUUID": "org001", 
     "location": { 
     "buildings": [ 
      { 
      "buildingUUID": "sit001", 
      "floors": [ 
       { 
       "floorUUID": "GrndFlr", 
       "assets": [ ], 
       "agents": [ ], 
       "users": [ ] 
       }, 
       { 
       "floorUUID": "1stFlr", 
       "assets": [ ], 
       "agents": [ ], 
       "users": [ ] 
       } 
      ] 
      }, 
      { 
      "buildingUUID": "ist001", 
      "floors": [ ] 
      } 
     ] 
     } 
    }, 
    { 
     "orgUUID": "org002", 
     "location": { 
     "buildings": [ ] 
     } 
    } 
    ] 
}, 
{ 
    "providerUUID": "prov002", 
    "orgs": [ ] 
} 
] 
} 

问题用通俗的话说, “1.获取所有orgUUID S的下降providerUUID: "prov001"下”。 类似地,“2.获取所有floorUUIDs,其中"buildingUUID": "sit001"”。

如果有人能帮我解决第一个问题,我希望自己能解决第二个问题。

回答

0

由于某些原因,我不得不改变集合中的数据如下。

{ 
"productUUID": "prod001", 
"providers": [ 
{ 
    "providerUUID": "prov001", 
    "orgs": [ 
    { 
     "orgUUID": "org001", 
     "floors": [ 
     { "floorUUID": "SIT_GrndFlr" }, 
     { "floorUUID": "SIT_1stFlr" } 
     ], 
     "assets": [{},{}], 
     "agents": [{},{}], 
     "users": [{},{}] 
    }, 
    { 
     "orgUUID": "org002", 
     "floors": [ 
     { "floorUUID": "IST_1stFlr" }, 
     { "floorUUID": "IST_2ndFlr" } 
     ], 
     "assets": [{},{}], 
     "agents": [{},{}], 
     "users": [{},{}] 
    } 
    ] 
}, 
{ 
    "providerUUID": "prov002", 
    "orgs": [ 
    { 
     "orgUUID": "org001", 
     "floors": [{},{}], 
     "assets": [{},{}], 
     "agents": [{},{}], 
     "users": [{},{}] 
    }, 
    { 
     "orgUUID": "org002", 
     "floors": [{},{}], 
     "assets": [{},{}], 
     "agents": [{},{}], 
     "users": [{},{}] 
    } 
    ] 
} 
] 
} 

所以,现在@yogesh的帮助下,我被介绍给aggregate,并能编写查询了我的问题。

1. Get all `orgUUID`s under `providerUUID: "prov001"`. 
db.collectionName.aggregate({"$unwind":"$providers"}, 
         {"$match":{"providers.providerUUID":"prov001"}}, 
         {"$project":{"orgUUID":"$providers.orgs.orgUUID"}}, 
         {"$unwind":"$orgUUID"}, 
         {"$project":{"_id":0,"orgUUID":1}} 
         ) 

2. Get all `floorUUID`s under `orgUUID : "org001"`. 
db.collectionName.aggregate(
    { "$unwind" : "$providers" },  
    { "$match" : { "providers.providerUUID" : "prov001" } },  
    { "$unwind" : "$providers.orgs" },  
    { "$match" : { "providers.orgs.orgUUID" : "org001" } },  
    { "$project" : { "floorUUID" : "$providers.orgs.floors.floorUUID" } },  
    { "$unwind" : "$floorUUID" },  
    { "$project" : { "_id":0 , "floorUUID" : 1 } } 
) 
1

Mongo aggregation用于查找嵌套文档。首先unwind所有providers阵列然后使用match匹配providerUUID给出prov001然后用project让所有orgUUID和聚集查询为:

db.collectionName.aggregate({"$unwind":"$providers"}, 
          {"$match":{"providers.providerUUID":"prov001"}}, 
          {"$project":{"orgUUID":"$providers.orgs.orgUUID"}}, 
          {"$unwind":"$orgUUID"}, 
          {"$project":{"_id":0,"orgUUID":1}} 
          ).pretty() 

这将在一个数组返回所有orgUUID

如果使用$elemMacth那么作为

的$ elemMatch操作这个操作符有它自身的局限性匹配包含与所有指定查询条件匹配的至少一个元素的数组字段的文件。

elemMatch查询作为:

db.collectionName.find({"providers":{"$elemMatch":{"providerUUID":"prov001"}}}, 
         {"providers.$.providerUUID.orgs.orgUUID":1}).pretty() 

它返回整个匹配providers阵列。

我希望你会发现“2”问题查询自己,如果您有与“2”查询发现,我将发布“2”查询还任何麻烦。试着自己找出第二个查询答案:)

+0

在第一个聚合查询,如果您$ project'平仓后''写喜欢orgUUID'这'$开卷:$ orgUUID'你会得到你预期的结果 – Yogesh