我搜索了SO并抓取了Mongoose / Mongo文档,但无济于事,因此我的问题 .
我想 $inc
在嵌套数组中的对象中的值或者如果它还没有那么创建 $setOnInsert
这个对象 .
我看到的Mongo文件如下:
{
"_id": "123",
"members": [
{
"first": "johnny",
"last": "knoxville",
"score": 2
},
{
"first": "johnny",
"last": "cash",
"score": 3
},
// ...and so on
],
}
根据这个例子,我的用例是:
-
在数组对象内增加
count
变量(如果存在)(基于first
和last
找到) -
如果对象尚未存在,则将对象添加到具有
score
的集合中
从this post我明白我不能 $set
一个我想同时变量 $inc
. 好的 - 这很有道理 .
This post帮助理解位置 $
运算符,以便找到嵌套对象并递增它 .
如果我知道该文档存在,我可以简单地进行如下更新:
myDoc = { first: 'johnny', last: 'cash' };
myCollection.findOneAndUpdate(
{
_id: '123',
'members.first': 'johnny',
'members.last': 'cash'
},
{
$inc: { "members.$.score": 1 }
}
);
但是如果我想插入成员(使用 score: 1
),如果它还不存在怎么办?
我的问题是,当我使用upsert:true时,位置运算符会抛出一个错误,因为它可能不会与upsert一起使用(参见official documentation) .
我尝试了各种组合,并希望避免2 db访问(读/写) .
有没有办法在一次操作中执行此操作?