我有一个看起来像这样的数据模型
{
_id: 1
some_property: some_value
items: [
{
item_id: item1
item_properties: [
{
key1: val1,
key2: val2
}]
}]
}
当我收到item_id=itemX
的新项目时,我想检查带有此item_id的项目是否在items数组中。如果它不存在,则插入它。如果它存在,我想将item_properties附加到现有的item_properties。
我尝试使用$addToSet
,但这会考虑整个项目而不是item_id本身。结果是2个项目具有相同的item_id。
我知道如何以原子方式实现这一目标吗?
谢谢, 阿里扎
答案 0 :(得分:0)
我认为以下代码可以原子方式运行。
function doWhenItemExisted() {
var n = db.c.update({
"items.item_id" : itemX
}, {
$pushAll: { // I think item_properties of given item is also an array
"items.$.item_properties" : item.item_properties
}
}).nModified;
if (!n) {
doWhenItemNotExisted();
}
}
function doWhenItemNotExisted() {
var n = db.c.update({
"items.item_id" : {
$ne : itemX
}
}, {
$push: {
"items" : item
}
}).nModified;
if (!n) {
doWhenItemExisted();
}
}
// entry
doWhenItemExisted();