Я хотел бы определить стадию агрегирования $ project, на которой я могу дать ему указание добавить новое поле и включить все существующие поля без необходимости перечислять все существующие поля.
Мой документ выглядит так, с множеством полей:
{
obj: {
obj_field1: "hi",
obj_field2: "hi2"
},
field1: "a",
field2: "b",
...
field26: "z"
}
Я хочу сделать такую операцию агрегирования:
[
{
$project: {
custom_field: "$obj.obj_field1",
//the next part is that I don't want to do
field1: 1,
field2: 1,
...
field26: 1
}
},
... //group, match, and whatever...
]
Есть ли что-то вроде ключевого слова «включить все поля», которое я могу использовать в этом случае, или какой-то другой способ избежать необходимости перечислять каждое поле отдельно?
mongodb
mongodb-query
aggregation-framework
samuelluis
источник
источник
Ответы:
В 4.2+ вы можете использовать
$set
оператор конвейера агрегации, который представляет собой не что иное, как псевдоним,$addFields
добавленный в 3.4.источник
$addFields
является новым в MongoDB 3.4, который поддерживается драйвером C # версииIAggregateFluent<TResult>.AppendStage(new JsonPipelineStageDefinition<TInput, TOutput>("{ $addFields : { myField: 'myValue' }}")
Вы можете использовать $$ ROOT для ссылки на корневой документ. Сохраните все поля этого документа в поле и попытайтесь получить его после этого (в зависимости от вашей клиентской системы: Java, C ++, ...)
источник
document
опцией создания одного объединенного документа, было бы лучше ...custom_field
присоединенным новым .const newObj = { ...result.document, custom_field: result.custom_field }
>>> Есть что-то вроде ключевого слова "включить все поля", которое я могу использовать в этом случае или какое-то другое решение?
К сожалению, нет оператора для «включения всех полей» в операцию агрегирования. Единственная причина, почему, поскольку агрегация в основном создается для группировки / вычисления данных из полей коллекции (сумма, среднее и т.д.) и возврата всех полей коллекции, не является прямой целью.
источник
posts
с полями _id, title, body, like. Поле лайков - это массив _id пользователя, которому понравился пост. Как вы могли перечислить все сообщения со всеми _id, title, body, likeCount? В этом случае прямой целью является возврат всех полей.Начиная с версии 2.6.4, Mongo DB не имеет такой функции для
$project
конвейера агрегации. Из документов для$project
:и
источник
Чтобы добавить новые поля в документ, вы можете использовать
$addFields
из документов
и для всех полей в вашем документе вы можете использовать
$$ROOT
источник
согласно ответу @Deka, для драйвера c # mongodb 2.5 вы можете получить сгруппированный документ со всеми ключами, как показано ниже;
источник