У вас есть несколько вариантов:
На MongoDB v4.2 или выше && Если вы можете хранить строковое значение MongoDB _id
(уникальное), попробуйте это ::
Поскольку .updateMany () в последней версии принимает конвейер агрегации:
Site.updateMany(
// Filtering documents to check siteID not exists & equals to null (just null check will make sure field doesn't exists as well)
{ siteID: null },
[
{ $set: { siteID: { $toString: '$_id' } } }
])
На MongoDB ниже v4.2:
Сначала необходимо получить, а затем обновить:
a) Получить документы:
let response = Site.aggregate([{$match : {date : null}}, {$project :{siteID : {$toString : '$_id'}}}])
b) Обновить документы:
let bulkArr = [];
response.forEach(element => {
bulkArr.push({
updateOne: {
"filter": { _id: element._id }, // Use mongoose.Types.ObjectId(element._id) if needed.
"update": { '$set': { 'siteID': element.siteID } }
}
})
});
let updateResult = await Site.bulkWrite(bulkArr)
console.log('matchedCount ::', updateResult.matchedCount, 'modifiedCount ::', updateResult.modifiedCount)
На всякий случай, если вы не хотите хранить строковое значение _id
, то в Step a)
вы можете просто получить проекцию _id
и Step b)
создать случайную строку, используя :: generate- random-string-characters-in- javascript при переборе массива из Step 1)
.