我搜索了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 变量(如果存在)(基于 firstlast 找到)

  • 如果对象尚未存在,则将对象添加到具有 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访问(读/写) .

有没有办法在一次操作中执行此操作?