Подтвердить что ты не робот

Проект MongoDB $: сохранение предыдущих полей трубопровода

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

Итак, если я начинаю с коллекции, которая имеет "field1" и "field2", и делает следующий прогноз:

{ $project: { field3: { $gt: ['$field1', 10] } } }

Я хочу закончить с "field1", "field2" и "field3", представленными как входные данные на следующий этап, или вывод из структуры агрегации.

Я попытался перевести проекцию в режим исключения, исключив _id, но это не работает.

4b9b3361

Ответ 1

MongoDB 2.6 представила новую переменную агрегации $$ROOT, которая почти делает то, что вы хотите: она будет включать полный документ, обрабатываемый в текущий этап трубопровода, поэтому вам не нужно знать или указывать, какие поля включать.

Взяв пример вашего агрегации и добавив проекцию fields с помощью $$ROOT:

db.pipeline.aggregate(
    { $project: {
        field3: {
            $gt: ['$field1', 10]
        },
        fields: "$$ROOT"
    }}
)

Выход будет включать в себя как новое вычисляемое поле (ы), так и все исходные поля:

{
    "_id" : ObjectId("53b56cc542974939144cee2a"),
    "field3" : false,
    "fields" : {
        "_id" : ObjectId("53b56cc542974939144cee2a"),
        "field1" : 1,
        "field2" : 2,
        "field3" : 3
    }
}

MongoDB 3.3.11 представляет этап агрегации addFields, который делает то, что вы хотите. См. Эту запись в трекером MongoDB: SERVER-5781 - Внедрить этап агрегации $addFields для использования языка выражения для добавления новых полей в документ.

Ответ 2

где $project необходимо указать, какие поля пройти, $addFields вернет все поля и добавит или заменит указанные поля.

{ $addFields: { field3: { $gt: ['$field1', 10] } } }

достигнет именно того, что вы хотите.

Обратите внимание, что эта функция была добавлена ​​в версии Mongo 3.4.

Ответ 3

По умолчанию будет проецироваться только _id. Вы должны указать, какие другие поля нужно проецировать.

{ $project: { field1:1,field2:1, field3: { $gt: ['$field1', 10] } } }

или

{ $project: { field1:'$field1',field2:'$field2', field3: { $gt: ['$field1', 10] } } }