mongodb:仅当某个字段不存在时才将项插入数组

时间:2014-10-21 20:47:33

标签: mongodb

我有一个看起来像这样的数据模型

{
    _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。

我知道如何以原子方式实现这一目标吗?

谢谢, 阿里扎

1 个答案:

答案 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();