更新具有不同值的多个文档的方法

Lin*_*orn 15 mongodb nosql pymongo

我有以下文件:

[{
  "_id":1,
  "name":"john",
  "position":1
},
 {"_id":2,
  "name":"bob",
  "position":2
},
 {"_id":3,
  "name":"tom",
  "position":3
}]
Run Code Online (Sandbox Code Playgroud)

在UI中,用户可以改变项目的位置(例如,将Bob移动到第一位置,john获得位置2,tom-位置3).有没有办法一次更新所有文件中的所有职位?

Der*_*ick 25

您无法使用MongoDB查询一次更新两个文档.您将始终必须在两个查询中执行此操作.您当然可以将字段的值设置为相同的值,或者使用相同的数字递增,但是您不能使用相同的查询在MongoDB中执行两个不同的更新.

  • @ nothing-special-here它仍然是真的."multi"参数允许您更新多个文档,但不允许在同一更新操作中为不同文档设置不同的值. (25认同)

Shu*_*ham 8

从 mongodb 4.2 开始,您可以使用 $set 运算符在更新中使用管道

由于聚合管道中有许多运算符,现在有很多可能的方法,尽管我提供了其中之一

    exports.updateDisplayOrder = async keyValPairArr => {
    try {
        let data = await ContestModel.collection.update(
            { _id: { $in: keyValPairArr.map(o => o.id) } },
            [{
                $set: {
                    displayOrder: {
                        $let: {
                            vars: { obj: { $arrayElemAt: [{ $filter: { input: keyValPairArr, as: "kvpa", cond: { $eq: ["$$kvpa.id", "$_id"] } } }, 0] } },
                            in:"$$obj.displayOrder"
                        
                        }
                    }
                }
            }],
            { runValidators: true, multi: true }
        )

        return data;
    } catch (error) {
        throw error;
    }
   }
Run Code Online (Sandbox Code Playgroud)

示例键值对是:[{"id":"5e7643d436963c21f14582ee","displayOrder":9}, {"id":"5e7643e736963c21f14582ef","displayOrder":4}]


Mor*_*zov 6

您可以使用它db.collection.bulkWrite()来批量执行多项操作。自 以来一直可用3.2

可以不按顺序执行操作以提高性能。