Каков наилучший способ сохранения агрегированных результатов Mongo?

#mongodb #aggregation-framework

#mongodb #агрегация-фреймворк

Вопрос:

Используя результаты этого запроса:

 const results = db.collection.aggregate([
  { $match: { _id: { in: ids } } },
  { $set: {
    field: {
      $cond: {
        if: someCondition,
        then: true,
        else: "$field"
      }
    }
  } }
])
 

Каков наилучший способ сохранения results ? Использование updateMany ? Но как?
Результаты агрегирования представляют собой массив db.collection документов. Для этого должно быть оптимизированное решение?

Я ожидал, что в Mongo будет что-то вроде:

 // (WARNING: This code is not valid)
db.collection.updateDocuments(arrayOfUpdatedDocuments)
 

ПРИМЕЧАНИЕ: я не могу использовать $out , потому что мы не используем Mongo 4.4, поэтому я не могу писать в той же запрашиваемой коллекции.

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

1. Используйте $merge или $out для другой коллекции. Какую проблему вы пытаетесь решить?

2. @D.SM Я хочу запрашивать и обновлять коллекцию наиболее эффективным способом.

3. $out доступно, начиная с MongoDB 2.6, если только вы не хотите создать коллекцию в другой базе данных, в этом случае начиная с MongoDB 4.4. Используете ли вы более старую версию?

Ответ №1:

Я обнаружил, что bulkWrite это позволяет отправлять целый документ при каждом обновлении. Итак, это будет хороший вариант:

     db.collection.bulkWrite(
      results.map((doc) => {
        return {
          updateOne: {
            filter: { _id: doc._id },
            update: doc,
          },
        };
      })
    )