使用mongoose插入或更新到Mongo并在更新时修改内部元素

时间:2018-01-23 12:38:20

标签: node.js mongodb mongoose

假设有一个集合,其中包含field_1唯一的文档

[
    {
       field_1: 'abc',
       field_2: 0,
       field_3: []
    }
]

我想添加其他文档,但field_1'abc'相同。在这种情况下,我想增加field_2,并在更新时将元素追加到field_3。如果field_1不同,请创建另一个文档。

处理此类查询的最佳方法是什么?我的第一个想法是搜索,然后插入,如果没有找到文件,或有更好的方法?这种方法的问题是,如果我一次插入多个文档,我就无法使用搜索,如果没有找到文档,请插入'有效地接近。

2 个答案:

答案 0 :(得分:2)

Mongoose现在使用findOneAndUpdate本地支持它(调用MongoDB findAndModify)。

upsert = true选项会创建对象(如果它不存在)。默认为false。

MyModel.findOneAndUpdate(
    {foo: 'bar'}, // find a document with that filter
    modelDoc, // document to insert when nothing was found
    {upsert: true, new: true, runValidators: true}, // options
    function (err, doc) { // callback
        if (err) {
            // handle error
        } else {
            // handle document
        }
    }
);

答案 1 :(得分:1)

如果field_1的唯一性由唯一索引强制执行,则可以使用一种乐观锁定。

首先你尝试更新:

db.collection.update(
    {
       field_1: 'abc'
    },
    {
       $inc: {field_2: 1},
       $push: {field_3: 'abc'},
    }
);

并检查操作结果 - 如果更新了1个文档,则无需再执行任何操作。否则,它是第一个带有field_1 =='abc'的文档,因此您尝试插入它:

db.collection.insert(
    {
       field_1: 'abc',
       field_2: 0,
       field_3: []
    }
);

并发现错误。如果没有错误,则不再需要其他操作。否则会有并发插入,因此您需要再次重复更新查询。