Как объединить и объединить результат в коллекцию?

Я хочу скопировать и вставить результаты в существующую коллекцию, не удаляя эту коллекцию. Документация, по-видимому, предполагает, что это невозможно. Мне трудно поверить.

Функция уменьшения карты имеет "режимы вывода", в том числе "слияние", что делает то, что я хочу. Я ищу эквивалент для агрегации.

Новый этап $out поддерживает вставку в коллекцию, но вместо замены он заменяет коллекцию. Если бы я сделал это, я бы (я думаю) должен был запустить еще одну карту, чтобы объединить ее в другую коллекцию, что кажется неэффективным.

Я что-то упустил или нет функции, отсутствующей в функции агрегации?

Ответ 1

Я использовал вывод из агрегации для вставки/слияния в коллекцию:

    db.coll2.insert(
      db.coll1.aggregate([]).toArray()
    )

Ответ 2

Чтение документации отвечает на этот вопрос совершенно точно. Atm mongo не может делать то, что вы хотите.

Операция $out создает новую коллекцию в текущей базе данных, если ее еще нет. Коллекция не отображается до завершения агрегации. Если агрегация не удалась, MongoDB не создает коллекцию.

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

Ответ 3

Если вы не застряли на использовании операторов агрегирования, вы можете сделать инкрементное уменьшение карты в коллекции. Этот оператор позволяет объединить результаты в существующую коллекцию.

Смотрите следующую документацию:

http://docs.mongodb.org/manual/tutorial/perform-incremental-map-reduce/

Ответ 4

Для тех, кто придет к этому более недавно, это доступно из версии 4.2, вы сможете сделать это с помощью оператора $ merge в конвейере агрегации. Это должен быть последний этап в разработке.

{ $merge: { into: "myOutput", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } }