Проект MongoDB $: сохранение предыдущих полей трубопровода
Есть ли способ в прогнозе MongoDB указать некоторые новые поля (но в то же время сохранить поля, которые были введены на этап проектирования конвейера)? Я не переименовываю ни одно из существующих полей.
Итак, если я начинаю с коллекции, которая имеет "field1" и "field2", и делает следующий прогноз:
{ $project: { field3: { $gt: ['$field1', 10] } } }
Я хочу закончить с "field1", "field2" и "field3", представленными как входные данные на следующий этап, или вывод из структуры агрегации.
Я попытался перевести проекцию в режим исключения, исключив _id, но это не работает.
Ответы
Ответ 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] } } }