更新路径 '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"}}
)
当我尝试更新更新插入项目时发生此错误:
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"}}
)