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循环是一个选项,是的。我没有得到回调部分。如果您询问回调如何在一般来说,这太宽泛了。如果你在回电方面有一些特殊的问题,请发表一个有明确问题陈述的问题。