2014-10-09 120 views
0

我需要在MongoDB中獲取數組數組中的一個特定對象。在MongoDB中獲取數組數組中的特定對象

我只需要獲取任務對象= [_id = ObjectId(「543429a2cb38b1d83c3ff2c2」)]。

我的文件(項目):

{ 
    "_id" : ObjectId("543428c2cb38b1d83c3ff2bd"), 
    "name" : "new project", 
    "author" : ObjectId("5424ac37eb0ea85d4c921f8b"), 
    "members" : [ 
     ObjectId("5424ac37eb0ea85d4c921f8b") 
    ], 
    "US" : [ 
     { 
      "_id" : ObjectId("5434297fcb38b1d83c3ff2c0"), 
      "name" : "Test Story", 
      "author" : ObjectId("5424ac37eb0ea85d4c921f8b"), 
      "tasks" : [ 
       { 
        "_id" : ObjectId("54342987cb38b1d83c3ff2c1"), 
        "name" : "teste3", 
        "author" : ObjectId("5424ac37eb0ea85d4c921f8b") 
       }, 
       { 
        "_id" : ObjectId("543429a2cb38b1d83c3ff2c2"), 
        "name" : "jklasdfa_XXX", 
        "author" : ObjectId("5424ac37eb0ea85d4c921f8b") 
       } 
      ] 
     } 
    ] 
} 

結果預計:

{ 
    "_id" : ObjectId("543429a2cb38b1d83c3ff2c2"), 
    "name" : "jklasdfa_XXX", 
    "author" : ObjectId("5424ac37eb0ea85d4c921f8b") 
} 

但我沒有得到它。 我還沒有成功的測試:

db.projects.find({   
     "US.tasks._id" : ObjectId("543429a2cb38b1d83c3ff2c2")   
    }, { "US.tasks.$" : 1 }) 

我用$ elemMatch tryed過,但沒有什麼回報。

db.projects.find({  
     "US" : { 
      "tasks" : { 
       $elemMatch : { 
        "_id" : ObjectId("543429a2cb38b1d83c3ff2c2")       
       }    
      } 
     }  
}) 

我可以只使用find()得到我的結果嗎?如果沒有,什麼和如何使用?

謝謝!

回答

0

您需要爲一個aggregatio N:

db.projects.aggregate([{$unwind:"$US"}, 
         {$unwind:"$US.tasks"}, 
         {$match:{"US.tasks._id":ObjectId("543429a2cb38b1d83c3ff2c2")}}, 
         {$project:{_id:0,"task":"$US.tasks"}}]) 

應該返回

{ task : { 
    "_id" : ObjectId("543429a2cb38b1d83c3ff2c2"), 
    "name" : "jklasdfa_XXX", 
    "author" : ObjectId("5424ac37eb0ea85d4c921f8b") 
} 

說明:

  • $unwind每個數組元素
  • 創建一個新的(虛擬)文件
  • $match是你發現的查詢部分
  • $project是類似項目中找到部分即它指定要在結果
  • 拿到領域

您可能希望在$unwind如果之前添加第二個$match你知道你正在搜索的文檔(查看性能指標)。


編輯:添加了第二$unwindUS以來是一個數組。

不知道你在做什麼(所以真的不知道,只是sugesting),但你可能想要檢查你的模式(和mongodb)是否適合你的任務,因爲文檔看起來就像非規範化的關係數據可能一個關係數據庫對你來說會更好。

+0

真棒解釋和提示!謝謝! – GabrielBiga 2014-10-09 13:53:06