在Mongo中,映射数组并更新文档

时间:2019-02-10 22:56:00

标签: arrays node.js mongodb mongoose

我正在尝试在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尚未更新。

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

1 个答案:

答案 0 :(得分:0)

map是一个同步功能,您正在使用它与findOneAndUpdate进行异步更新,类似于将水和油混合在一起。

您需要在地图功能中使用async/awaitPromise.all。例如,使用上述方法,您可以使用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)
    }
})()