Как исключить _id без включения других полей, используя структуру агрегации

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

Это то, что я хочу (поле не включено явно):

db.col.find({},{_id:0})

Но в рамках агрегации это кажется невозможным:

db.col.aggregate([{'$project': {_id:0}}])

Error: Printing Stack Trace
    at printStackTrace (src/mongo/shell/utils.js:37:15)
    at DBCollection.aggregate (src/mongo/shell/collection.js:927:9)
    at (shell):1:11
2013-10-07T16:36:09.273+0200 aggregate failed: {
    "errmsg" : "exception: $projection requires at least one output field",
    "code" : 16403,
    "ok" : 0
} at src/mongo/shell/collection.js:928

Любая идея обойти эту проблему?


person crispamares    schedule 07.10.2013    source источник


Ответы (1)


При использовании агрегации вы должны явным образом включать/исключать поля. Итак, вам нужно будет перечислить все поля, которые вы хотите. Это не эквивалентно find. Итак, вы можете:

db.sample.aggregate(
    { $project : {
        _id : 0,
        title : 1             
    }}
);

Использование платформы агрегации также сопряжено с некоторыми ограничениями, о которых вам следует знать. . Он предназначен для агрегации (группировки, суммирования и т. д.), поэтому наличие большого количества полей в проекции не так типично (и может привести к тому, что результаты превысят максимально допустимый размер, равный 16 МБ).

person WiredPrairie    schedule 07.10.2013
comment
Mongodb 2.6 преодолеет эти ограничения... Возвращая курсор, конвейеры агрегации могут возвращать наборы результатов любого размера docs.mongodb.org/manual/release-notes/2.6 Я пробую версию 2.5.2, но по-прежнему необходимо явно включать поля. Очень жаль. :( - person crispamares; 07.10.2013
comment
Конечно, будущая версия может снять эти ограничения. Но, пока, это то, что есть. Aggregation Framework по-прежнему лучше всего подходит для группировки и т. д., и в этих случаях возврат большого количества полей обычно не имеет смысла. - person WiredPrairie; 07.10.2013
comment
ты обалденный ! Наконец-то я решил проблему! плюс один от меня - person Yahya; 17.04.2018