2017-05-07 62 views
0

這是我的文檔結構:貓鼬通過嵌套的對象ID找到返回整個文檔

{ 
"_id": "590dc8b17e52f139648b9b94", 
"parent": [ 
    { 
     "_id": "590dc8b17e52f139648b9b95", 
     "child": [ 
      { 
       "_id": "590dc8b17e52f139648b9b8f" 
      }, 
      { 
       "_id": "590dc8b17e52f139648b9b90" 
      } 
     ] 
    }, 
    { 
     "_id": "590dc8c57e52f139648b9b9b", 
     "child": [ 
      { 
       "_id": "590dc8c57e52f139648b9b96" 
      } 
     ] 
    } 
]} 

我試圖返回只有約我在找其_id嵌套對象的信息。

router.get('/child/:id', (req, res) => { 
    Project.findOne({ 'parent.child._id': req.params.id }, 
      (err, results) => { 
        if (err) 
          res.status(500).send(err); 
     res.status(200).json(results.parent[0].child.id(req.params.id)); 

      } 
    )}); 

問題是結果包含可能含有 的多個實例,所以,很顯然我的代碼只能將整個文檔,如果已知孩子 _id它在第一個父。

我該如何解決? 非常感謝

所以顯然解開和匹配的解決方案是好的,但對於貓鼬,你需要明確地說,id是一個ObjectId類型。

{$match: 
{ "parent.child._id": new mongoose.Types.ObjectId(id) } 
      } 

found it here

+0

嘗試使用[elemMatch(https://docs.mongodb.com/manual/reference/operator/projection/elemMatch/) – gaganshera

回答

1

基本上可以美元,合計第一解開父母,然後與孩子ID相符。這將確保它只給出父對象而不是整個文檔。另外,如果匹配的id不需要在第一個父對象內部,但它可以在父對象數組內的任何位置。它將從包含其子數組中的搜索標識的父數組中返回require對象。

db.project.aggregate([ 
    { $unwind : '$parent'}, 
    { $match : 
     { "parent.child._id" : '590dc8b17e52f139648b9b8f' } 
    } 
]); 

Mongooese語法:

//mongoose 

let Project = mongoose.model('project', yourProjectSchema); 

Project.aggregate([ 
    { "$unwind" : '$parent'}, 
    { "$match" : 
     { "parent.child._id" : req.params.id } 
    } 
]); 
+0

謝謝,我仍然試圖理解爲什麼我收到一個空數組作爲結果 –

+0

您是否收到上面提到的聚合解決方法之後的空數組?還請確保您替換我提到的靜態ID與您的需求參數 –

+0

是的,我試着用現有的硬編碼ID和實際的請求參數。 另外我不得不將db.project.aggregate更改爲Project.aggregate,因爲我正在使用貓鼬 –