Mongodb 更新路径';x';将在'处产生冲突;x';
当我尝试更新upsert项时发生此错误: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
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”,解决了我的问题。