Я ищу наиболее эффективный способ изменить все документы коллекции из этой структуры:
{
[...]
myValues:
{
a: "any",
b: "content",
c: "can be found here"
}
[...]
}
, чтобы она стала такой:
{
[...]
a: "any",
b: "content",
c: "can be found here"
[...]
}
По сути, я хочувсе под полем myValues
, которое должно быть помещено в его родительский документ для всех документов коллекции.
Я искал способ сделать это в одном запросе, используя dbCollection.updateMany()
.не представляется возможным сделать такую вещь, если только содержание myValues
не является одинаковым для всех документов.Но в моем случае содержание myValues
меняется с одного документа на другой.Например, я попытался:
db.getCollection('myCollection').updateMany({ myValues: { $exists: true } }, { $set: '$myValues' });
, думая, что это, возможно, разрешит объект myValues
и использует этот объект для установки его в документе.Но он возвращает ошибку, в которой говорится, что присвоение строки полю $set
недопустимо.
Так что будет наиболее эффективным подходом к тому, что я пытаюсь сделать?Есть ли способ обновить все документы коллекции, как мне нужно, в одной команде?
Или мне нужно перебирать каждый документ коллекции и обновлять их один за другим?
Сейчас я перебираю все документы со следующим кодом:
var documents = await myCollection.find({ myValues: { $exists: true } });
for (var document = await documents.next(); document != null; document = await documents.next())
{
await myCollection.updateOne({ _id: document._id }, { $set: document.myValues, $unset: { myValues: 1} });
}
Поскольку моя коллекция очень большая, ее выполнение занимает очень много времени.