2015-05-31 42 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