2014-09-05 2 views
5

Я пытаюсь получить конкретное поле из массива поддокументеКак получить конкретное поле из поддокумента массива с мангуста

Я не будет включать в себя любой из полей в родительском документе

Вот пример документа

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

Я хотел бы вернуться в ранг иерархии, если идент находится в USERID массиве

вот то, что я до сих пор в мой запрос

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

до сих пор она возвращает весь объект в массиве иерархий Я хочу, но я хотел бы ограничить его только ранг свойства объекта.

+0

Вы пытались получить результат с 'lean: true' - это может сработать ... Не на 100% уверен, просто идея. – mbernath

ответ

0

Проектор, доступный для .find() запросов, как правило, в MongoDB, не делает такого рода проекцию для внутренних элементов массива. Все, что вы обычно можете сделать, это полностью вернуть «согласованный» элемент массива.

За то, что вы хотите, вы используете aggregation framework вместо этого, что дает вам больший контроль над согласованием и проекцией:

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

}) 

Это в основном соответствует документам, фильтрует содержимое массива документа просто матч и затем проектирует только требуемое поле.

Смежные вопросы