首页 > 解决方案 > 在 Mongo 中,映射数组并更新文档

问题描述

我正在尝试更新 mongo 中的多个文档。

我有一个数组,我想用该数组中的特定对象更新多个 mongo 文档。

let items = [{ order: 0 }, { order: 1 }, { order: 2 }]

我试过这个来更新 mongo:

items.map((item) => {
    db.items.findOneAndUpdate(
        { _id: item._id },
        { $set: { order: item.order } }
    )
})

如果我检查项目,它实际上已经更新了数组:

console.log(items)

但是当我查看我的数据库时,MongoDB 并没有更新。

有什么建议我做错了吗?谢谢!

标签: arraysnode.jsmongodbmongoose

解决方案


map是一个同步函数,你用它来进行异步更新findOneAndUpdate,类似于混合水和油。

您需要使用async/awaitPromise.all使用 map 函数。例如,使用上面的方法,您可以使用 map 函数创建一个 Promise 数组并使用Promise.all

const updatePromises = items.map(({ _id, order }) => (
    Item.findOneAndUpdate({ _id }, {'$set': { order } })
)) 

Promise.all(updatePromises).then(console.log).catch(console.error)

使用异步/等待

(async () => {
    try {
        for(let i=0; i<items.length; i++) {
            await Item.findOneAndUpdate(
                { _id: item._id },
                { $set: { order: item.order } }
            )
        }
    } catch (err) {
        console.error(err)
    }
})()

推荐阅读