Какие операторы на каких этапах работают с MongoDB Aggregate?

#mongodb #aggregate

#mongodb #агрегат

Вопрос:

Я изучаю фреймворк Aggregate уже около 6 месяцев.

Я часто прихожу в восторг от нового оператора. Я читаю об этом, нахожу вариант использования, пытаюсь его использовать, и он неизбежно терпит неудачу…

Оказывается, этот оператор предназначен только для $project этапа, и я пытался использовать его на $addField этапе. Это явно нигде не указано в документации оператора, поэтому требуется несколько часов чтения примеров переполнения стека, прежде чем я осознаю свою ошибку.

Для меня, как для парня, работающего неполный рабочий день в Mongo (который в основном просто балуется Aggregate, чтобы облегчить мою интерфейсную жизнь), это огромная проблема. На данный момент я читал и перечитывал документацию MongoDB не менее 30 часов, но мне все еще не ясно, какие операторы используют какие этапы фреймворка.

Я уверен, что кто-то еще сталкивался с этим. Существует ли какое-либо краткое справочное руководство?

Комментарии:

1.«… и я пытался использовать его на этапе $ newField». Ну, в MongoDB Aggregation Framework нет $newField этапа. Смотрите Этапы агрегации и операторы агрегации.

2. $addField … спасибо

3. Действительно ли существует оператор, который работает в $project, но не в $ addFields? Я никогда не слышал о таком.

Ответ №1:

Существуют отдельные наборы операторов для запросов, проекции, выражений конвейера агрегации и обновлений

Этап $match принимает документ запроса, а не выражение агрегации. Но вы можете встроить выражение агрегации в документ запроса, используя оператор $expr.

Этапы $project, $addFields и $set могут использовать операторы проекции и конвейера агрегации.

Если оператор агрегации может использоваться только на определенных этапах, в его документации будет указано это ограничение. Обратите внимание, что могут быть несвязанные операторы, которые имеют одно и то же имя.

Примеры: В
документации к оператору агрегации $push говорится: $push is only available in the $group stage.
Но там также есть оператор обновления $ push, который можно использовать с функциями update *.
Арифметический оператор $add может использоваться на любом этапе, который может принимать выражение.
Оператор $first accumulator может использоваться только на этапе $group
, но оператор выражения массива $first может использоваться на любом этапе, где разрешено выражение.