Как сделать значения по умолчанию из другого документа?

В MongoDB для установки значений по умолчанию из другого документа можно использовать агрегационный фреймворк или функцию bulkWrite().

1. Использование агрегационного фреймворка:
В этом случае вы можете использовать оператор $lookup для объединения двух коллекций, а затем оператор $project для установки значений по умолчанию из другого документа. Например:

db.collection.aggregate([
  {
    $lookup: {
      from: "defaultCollection",
      localField: "field",
      foreignField: "field",
      as: "defaultValues"
    }
  },
  {
    $project: {
      field1: {
        $ifNull: ["$field1", {$arrayElemAt: ["$defaultValues.field1", 0]}]
      },
      field2: {
        $ifNull: ["$field2", {$arrayElemAt: ["$defaultValues.field2", 0]}]
      }
    }
  }
])

В этом примере мы связываем две коллекции collection и defaultCollection по полю field и затем проецируем значения полей, устанавливая значения по умолчанию из соответствующего документа в defaultCollection.

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

2. Использование функции bulkWrite():
Этот метод позволяет массово обновлять документы, включая установку значений по умолчанию из другого документа. Например, вы можете получить документ из defaultCollection и затем использовать его значения для обновления соответствующих документов в collection. Вот как это можно сделать:

var defaultDoc = db.defaultCollection.findOne({});
var bulkWriteOps = [];

db.collection.find({}).forEach(function(doc) {
  var updateDoc = { $set: {} };

  if (!doc.field1) {
    updateDoc.$set.field1 = defaultDoc.field1;
  }

  if (!doc.field2) {
    updateDoc.$set.field2 = defaultDoc.field2;
  }

  bulkWriteOps.push({ updateOne: { filter: { _id: doc._id }, update: updateDoc } });
});

db.collection.bulkWrite(bulkWriteOps);

В этом примере мы получаем документ из defaultCollection и затем обходим каждый документ в collection. Если значение поля отсутствует (null или не определено), мы устанавливаем соответствующее значение из defaultDoc в updateDoc, которое затем используется для обновления документа в collection с помощью функции bulkWrite().

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

В обоих случаях вам также потребуется настроить запросы и подставить свои конкретные названия коллекций, полей и фильтров, чтобы они соответствовали вашему конкретному случаю использования.