2014-01-10 3 views
3

Я использует следующий запрос, чтобы извлечь один последний комментарий для каждого сообщения в базе данных:Возвращения всего документа от агрегации

db.comments.aggregate([ 
    { 
     "$match": { 
      "post_id": { 
       "$in": [ObjectId("52c5ce24dca32d32740c1435"), ObjectId("52c5ce24dca32d32740c15ad")] 
      } 
     } 
    }, 
    { 
     "$sort": {"_id": -1} 
    }, 
    { 
     "$group": { 
      "_id": "$post_id", 
      "lastComment": { 
       "$first": "$_id" 
      } 
     } 
    } 
]) 

Я ожидаю, что это возвратите весь комментарий документ, но он возвращает только _id поля каждого документа. Итак, каков был бы правильный способ получить все последние комментарии в целом документе (или, по крайней мере, включить некоторые другие поля)?

+0

являются комментарии в пределах поля документа? Вы выбираете первый _id группы, но если у вас есть другое поле с комментариями, вы должны изменить «$ _id». Может быть, примерный документ может нам помочь. – rubenfa

+0

Комментарии хранятся в отдельной коллекции, где каждый комментарий является отдельным документом, и каждый из них ссылается на документ соответствующего сообщения через поле «post_id». Если это ответит на ваш вопрос. –

ответ

14

В настоящее время вы не можете получить весь документ comment через одного оператора $first. Но вы можете включать другие необходимые поля (аналогичные _id области) во время $group этапа:

{ 
    "$group": { 
     _id: "$post_id", 
     lastComment: { "$first": "$_id" }, 
     field_1: { "$first": "$field_1" }, 
     field_2: { "$first": "$field_2" }, 
     // ... 
     field_N: { "$first": "$field_N" } 
    } 
} 

Согласно этому JIRA билета: https://jira.mongodb.org/browse/SERVER-5916, весь документ будет доступен для возврата из агрегирования операций с 2.5. 3 версия. Это будет возможно с помощью новых переменных: $$ROOT или $$CURRENT:

{ 
    "$group": { 
     _id: "$post_id", 
     lastComment: { "$first": "$$CURRENT" } 
    } 
} 
Смежные вопросы