我搜索了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
尚不存在,则将对象添加为1
从这篇文章中我了解到我不能同时$set
拥有一个我想要的变量$inc
.好的 - 这很有道理.
这篇文章有助于理解位置$
运算符,以便找到嵌套对象并增加它.
如果我知道该文档存在,我可以简单地进行如下更新:
myDoc = { first: 'johnny', last: 'cash' }; myCollection.findOneAndUpdate( { _id: '123', 'members.first': 'johnny', 'members.last': 'cash' }, { $inc: { "members.$.score": 1 } } );
但是如果我想插入成员(score: 1
如果它还不存在)怎么办?
我的问题是,当我使用upsert:true时,位置运算符会抛出错误,因为它可能不会与upsert一起使用(请参阅官方文档).
我尝试了各种组合,并希望避免2 db访问(读/写).
有没有办法在一次操作中执行此操作?