Mongodb 更新路径';x';将在'处产生冲突;x';

Mongodb 更新路径';x';将在'处产生冲突;x';,mongodb,upsert,Mongodb,Upsert,当我尝试更新upsert项时发生此错误: Updating the path 'x' would create a conflict at 'x' 字段应出现在$set或$setOnInsert中。不在两者中。如果在更新项目时在$set和$unset中传递相同的键,则会出现该错误 例如: const body = { _id: '47b82d36f33ad21b90' name: 'John', lastName: 'Smith' } MyModel.findByIdAnd

当我尝试更新upsert项时发生此错误:

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执行更新查询时遇到了同样的问题。
我试图做到:


>update({'name':'lmn'},{$inc:{'key1':2},$set:{'key1':5})
请注意,这里我试图从两个MongoDB更新操作符更新
key1
的值

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

您可以在上找到更新运算符的列表

以下是对该问题的主要解释:

MongoDB从 条件,然后将$set和$setOnInsert操作应用于 此文档。

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


以下是示例:

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

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'
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'

这没有道理。如果找到文档,“$set”发生;如果找不到文档,$setOnInsert发生。没有冲突,因为两者永远不会同时应用。如果不能在同一字段上同时使用这两个字段,那么这种情况就达不到目的,如果找到文档或未找到文档,则会发生no?
$set
。因此,它在
$setOnInsert
{upsert:true}
上处于“未找到”状态时发生冲突。似乎MongoDB开发人员无法定义一个对另一个的优先级:)是的,我意识到了这一点。实际上应该有一个“$setOnUpdate”操作符。作为mongodb文档,它将$set和$setOnInsert操作应用于此文档。是的,不要重复字段。没有人提到过这一点,但$setOnInsert实际上是在添加这些字段来更新文档。只需指定插入和更新文档时要插入的字段,不包括插入文档中的属性。对我来说,问题是两个操作符中出现的字段(“日期更新”)。我只在$set中留下了“dateUpdate”,解决了我的问题。