【问题标题】:In Mongo, map over array and update docs在 Mongo 中,映射数组并更新文档
【发布时间】:2019-07-04 10:34:30
【问题描述】:

我正在尝试更新 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 并没有更新。

任何建议我做错了什么? 谢谢!

【问题讨论】:

    标签: arrays node.js mongodb mongoose


    【解决方案1】:

    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)
        }
    })()
    

    【讨论】:

    • 非常感谢您的回复!不幸的是,两者都不起作用,它仍然没有保存到 mongodb。
    • 你在 Mongoose 中的型号名称是什么?
    • const itemSchema = new Schema({ order: Number }) const Item = mongoose.model('item', itemSchema);然后稍后我打电话给 Item.findOneAndUpdate(...
    • 对不起,我应该说我已经在使用我的模型名称(但它仍然不起作用)
    • nvm,明白了!小错字。感谢您的帮助,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2021-04-23
    • 2019-08-02
    • 2021-07-20
    • 1970-01-01
    • 2021-04-08
    相关资源
    最近更新 更多