Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用mongoose插入或更新Mongo,并在更新时修改内部元素_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 使用mongoose插入或更新Mongo,并在更新时修改内部元素

Node.js 使用mongoose插入或更新Mongo,并在更新时修改内部元素,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,假设有一个文档集合,其中字段_1是唯一的 [ { field_1: 'abc', field_2: 0, field_3: [] } ] 我想添加另一个文档,但是字段\u 1是相同的'abc'。在这种情况下,我想增加字段2,并在更新时将元素附加到字段3。如果字段_1不同,则创建另一个文档 处理此类查询的最佳方式是什么?我的第一个想法是搜索,如果没有找到文档,然后插入,或者有更好的方法吗?这种方法的问题是,如果一次插入多个文档,我无法有效

假设有一个文档集合,其中
字段_1
是唯一的

[
    {
       field_1: 'abc',
       field_2: 0,
       field_3: []
    }
]
我想添加另一个文档,但是
字段\u 1
是相同的
'abc'
。在这种情况下,我想增加
字段2
,并在更新时将元素附加到
字段3
。如果
字段_1
不同,则创建另一个文档


处理此类查询的最佳方式是什么?我的第一个想法是搜索,如果没有找到文档,然后插入,或者有更好的方法吗?这种方法的问题是,如果一次插入多个文档,我无法有效地使用“搜索,如果没有找到文档,则插入”方法

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
        }
    }
);

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
的唯一性,则可以使用一种乐观锁定

首先,您尝试更新:

db.collection.update(
    {
       field_1: 'abc'
    },
    {
       $inc: {field_2: 1},
       $push: {field_3: 'abc'},
    }
);
并检查操作结果-如果更新了1个文档,则无需执行更多操作。否则,它是第一个字段为_1==“abc”的文档,因此您尝试插入它:

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

并捕捉错误。如果没有错误,则无需执行更多操作。否则会出现并发插入,因此需要再次重复更新查询。

如果唯一索引强制执行
字段1的唯一性,则可以使用一种乐观锁定

首先,您尝试更新:

db.collection.update(
    {
       field_1: 'abc'
    },
    {
       $inc: {field_2: 1},
       $push: {field_3: 'abc'},
    }
);
并检查操作结果-如果更新了1个文档,则无需执行更多操作。否则,它是第一个字段为_1==“abc”的文档,因此您尝试插入它:

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

并捕捉错误。如果没有错误,则无需执行更多操作。否则会出现并发插入,因此您需要再次重复更新查询。

所有这些的用例是什么?所有这些的用例是什么?这不会解决多个文档被更新或升级的问题。根据过滤器,如果满足条件,则会对其进行更新,否则会为单个文档创建一个新文档。如果是针对多个文档,您可以使用FindModifyDocumentation来处理我想到的MyModel.findOneAndUpdate({foo:{$in:bars}},//查找带有该筛选器的文档modelDoc,//在未找到任何内容时插入的文档{upsert:true,new:true,runValidators:true},//选项函数(err,doc){//if(err){//handle error}else{//handle document}回调});此->的问题在于它没有插入多个文档。只有一个。并且使用$in->不包括查询的字段。您建议如何使用findAndModify?在其文档中,您可以更新多个文档,这应该可以做到。这不会解决多个文档被更新或插入的问题。根据过滤器,如果criter满足ia,然后更新它,否则将为单个文档创建一个新文档。如果是多个文档,则可以使用FindModifyDocumentation来处理我所认为的MyModel.findOneAndUpdate({foo:{$in:bars}},//查找带有该筛选器的文档modelDoc,//在找不到任何内容时插入的文档{upsert:true,new:true,runValidators:true},//options函数(err,doc){//callback if(err){//handle error}else{//handle document});此->的问题在于它没有插入多个文档。只有一个。并且使用$in->不包括查询的字段。您建议如何使用findAndModify?在其文档中,您可以更新多个文档,这应该可以做到。当使用字段时,您将如何执行相同的操作?{$in:['abc','def','ghi','jkl},所以假设没有“ghi”和“jkl”,我需要为def和ghi插入。如果更新了一定数量的文档,您如何确定哪些文档更新了,哪些文档没有更新,以便我可以批量插入,剩余的“ghi”和“jkl”对不起,我没有得到。Where
字段_1:{$in:['abc','def','ghi','jkl},
来自?从您最初的问题开始,
字段_1
是文档的唯一标识符,因此更新查询中的唯一条件是精确匹配此字符串。如果您有4个文档,请逐个执行。真的由您决定。for循环是一个选项,是的。我没有得到回调部分。如果您询问回调如何在一般来说,它太宽泛了。如果您在回调中遇到一些特殊问题,请发布一个问题,并给出明确的问题陈述。当使用字段_1:{$in:['abc'、'def'、'ghi'、'jkl']]时,您将如何做同样的事情,所以假设没有“ghi”和“jkl”,我需要为def和ghi插入。如果更新了一定数量的文档,您如何确定哪些文档更新了,哪些文档没有更新,以便我可以批量插入,剩余的“ghi”和“jkl”对不起,我没有得到。Where
字段_1:{$in:['abc','def','ghi','jkl},
来自?从您最初的问题开始,
字段_1
是文档的唯一标识符,因此更新查询中的唯一条件是精确匹配此字符串。如果您有4个文档,请逐个执行。真的由您决定。for循环是一个选项,是的。我没有得到回调部分。如果您询问回调如何在一般来说,这太宽泛了。如果你在回电方面有一些特殊的问题,请发表一个有明确问题陈述的问题。