Обновите много полей в mongodb со случайными значениями - PullRequest
1 голос
/ 11 января 2020

Мне нужно обновить все поля документа в mongodb случайными значениями:

Site.updateMany({siteID: undefined || null}, {$set: {siteID: shortid.generate()}});

shortid.generate() создает случайную строку. Проблема с моим кодом состоит в том, что все поля устанавливаются в одну и ту же случайную строку, что заставляет меня думать, что функция выполняется один раз, а затем обновляется для всех полей.
Как мне добиться обновления всех полей случайными строками?

Ответы [ 2 ]

1 голос
/ 11 января 2020

У вас есть несколько вариантов:

На 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).

0 голосов
/ 11 января 2020

Вы правы, функция оценивается первой, а ее результат передается в запрос только один раз.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...