更新路径 'x' 会在 'x' 处产生冲突

Updating the path 'x' would create a conflict at 'x'

当我尝试更新更新插入项目时发生此错误:

Updating the path 'x' would create a conflict at 'x'

字段应出现在 $set$setOnInsert 中。两者都没有。

如果您在更新项目时在 $set$unset 中传递相同的密钥,您将收到该错误。

例如:

const body = {
   _id: '47b82d36f33ad21b90'
   name: 'John',
   lastName: 'Smith'
}

MyModel.findByIdAndUpdate(body._id, { $set: body, $unset: {name: 1}})

// Updating the path 'name' would create a conflict at 'name'

我在使用 PyMongo 执行 更新 查询时遇到了同样的问题。
我正在尝试做:


> db.people.update( {'name':'lmn'}, { $inc : { 'key1' : 2 }, $set: { 'key1' : 5 }})

请注意,我在这里尝试从两个 MongoDB 更新运算符 更新 key1 的值。

当您尝试在同一查询中使用多个 MongoDB 更新运算符 更新 相同键 的值时,基本上会发生这种情况。

您可以在 here

上找到更新操作员列表
db.products.update(
  { _id: 1 },
  {
     $set: { item: "apple" },
     $setOnInsert: { defaultQty: 100 }
  },
  { upsert: true }
)

下面是问题的关键解释:

MongoDB creates a new document with _id equal to 1 from the condition, and then applies the $set AND $setOnInsert operations to this document.

如果您希望设置或更新字段值而不考虑插入或更新,请在 $set 中使用它。如果您希望它仅在插入时设置,请在 $setOnInsert 中使用它。

示例如下:https://docs.mongodb.com/manual/reference/operator/update/setOnInsert/#example

从 MongoDB 4.2 开始,您可以在更新中使用聚合管道:

db.your_collection.update({
    _id: 1
}, 
[{
    $set:{
        x_field: {
            $cond: {
                if: {$eq:[{$type:"$_id"} ,  "missing"]},
                then: 'upsert value',   // it's the upsert case
                else: '$x_field'    // it's the update case
            }
        }
    }
}],
{
     upsert: true
})

db.collection.bulkWrite()也支持

您不能在一次更新中多次引用相同的路径。例如,即使下面的结果符合逻辑,MongoDB 也不允许。

db.getCollection("user").updateOne(
  {_id: ...},
  {$set: {'address': {state: 'CA'}, 'address.city' : 'San Diego'}}
)

您会收到以下错误:

Updating the path 'address.city' would create a conflict at 'address'

我最近在使用下面的查询时遇到了同样的问题。

TextContainer.findOneAndUpdate({ blockId: req.params.blockId, 'content._id': req.params.noteId }, { $set: { 'content.note': req.body.note } }, { upsert: true, new: true })

当我将 'content.note' 更改为 'content.$.note' 时,它已得到修复。所以我的最终查询是:

TextContainer.findOneAndUpdate({ blockId: req.params.blockId, 'content._id': req.params.noteId }, { $set: { 'content.$.note': req.body.note } }, { upsert: true, new: true })

至少在 Ruby 库中,如果您有两次相同的密钥,则可能会出现此错误,一次作为符号,一次作为字符串:

db.getCollection("user").updateOne(
  {_id: ...},
  {$set: {'name': "Horse", name: "Horse"}}
)