2014-09-05 52 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) { 

}) 

基本上相匹配的文件,过滤文件的阵列满足于仅仅匹配和然后只投影必填字段。