2014-09-05 31 views
5

我試圖從一個子文檔陣列獲取特定領域如何從子文檔陣列檢索特定領域與貓鼬

我不會包括任何字段的父文檔

下面是示例文件

{ 
    "_id" : ObjectId("5409dd36b71997726532012d"), 
    "hierarchies" : [ 
     { 
      "rank" : 1, 
      "_id" : ObjectId("5409df85b719977265320137"), 
      "name" : "CTO", 
      "userId" : [ 
       ObjectId("53a47a639c52c9d83a2d71db") 
      ] 
     } 
    ] 
} 

我想回層次的等級,如果用戶ID是用戶id陣列

這裏就是我有這麼遠我的查詢

collectionName.find({{hierarchies: 
    {$elemMatch : {userId: ObjectId("53a47a639c52c9d83a2d71db")}}} 
    , "hierarchies.$.rank", function(err,data){} 

到目前爲止,它返回層次結構陣列我想在整個對象,但我想,以限制它只是對象的等級屬性。

+0

您是否嘗試過使用'lean:true'來獲得結果 - 這可能會奏效......並非100%肯定,只是一個想法。 – mbernath 2014-09-05 19:34:47

回答

0

通常在MongoDB中對.find()查詢的投影不會對數組的內部元素進行這種投影。你通常可以做的就是完全返回數組的「匹配」元素。

你想要的東西,你用aggregation framework相反,它使您可以匹配和投影更多的控制:

Model.aggregate([ 
    { "$match": { 
     "hierarchies.userId": ObjectId("53a47a639c52c9d83a2d71db") 
    }}, 
    { "$unwind": "$hierarchies" }, 
    { "$match": { 
     "hierarchies.userId": ObjectId("53a47a639c52c9d83a2d71db") 
    }}, 
    { "$project": { 
     "rank": "$hierarchies.rank" 
    }} 
],function(err,result) { 

}) 

基本上相匹配的文件,過濾文件的陣列滿足於僅僅匹配和然後只投影必填字段。