gpt4 book ai didi

mongodb - 更改数组中的现有对象但仍保留键的唯一性

转载 作者:可可西里 更新时间:2023-11-01 09:23:10 25 4
gpt4 key购买 nike

我有一个文件:

{ 'profile_set' :
[
{ 'name' : 'nick', 'options' : 0 },
{ 'name' : 'joe', 'options' : 2 },
{ 'name' : 'burt', 'options' : 1 }
]
}

如果我想将新对象添加profile_set只有对象的name不是' t already taken,不管 options,我可以用一个查询对象限定我的 update,如果 name 已经存在于配置文件集。在外壳中:

db.coll.update(
{_id: id, 'profile_set.name': {$ne: 'nick'}},
{$push: {profile_set: {'name': 'nick', 'options': 2}}})

因此,这只会对具有匹配 _id 并且没有 profile_set 元素的文档执行 $push name'nick'

问题 但是如果我以后需要更改 Nick 的名字(也许还有他的选项...),那就是更改一个现有的数组对象,而不是添加一个新的一。有没有一种方法可以在仍然遵守 name 的唯一约束的一个原子更新操作中做到这一点?

最佳答案

我认为有两个条件:

var newName = "somename";
var oldName = "nick";
var newOption = 3;

// if not change the name
db.coll.update({
_id : id,
'profile_set.name' : oldName
}, {
$set : {
"profile_set.$.options" : newOption
}
});

// if change the name
db.coll.update({
_id : id,
$and : [ {
'profile_set.name' : {
$ne : newName
}
}, {
'profile_set.name' : oldName
} ]
}, {
$set : {
"profile_set.$.name" : newName,
"profile_set.$.options" : newOption

}
});

关于mongodb - 更改数组中的现有对象但仍保留键的唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26590219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com