MongoTemplate upsert 属性 快照

MongoTemplate upsert property snapshot

我正在使用 mongo 4.2.15

这是条目:

{
  "keys": {
    "country": "US",
    "channel": "c999"
  },
  "counters": {
    "sale": 0
  },
  "increments": null
}

我希望能够初始化计数器集以及递增 counters.sale 值并将递增结果快照保存到 increments 属性。类似的东西:

db.getCollection('counterSets').update(
{ "$and" : [
    { "keys.country" : "US"}, 
    { "keys.channel" : "c999"}
  ]
},
{ "$inc" : 
    { "counters.sale" : 10
    },
  "$set" : 
    { "keys" : 
        { "country" : "US", "channel" : "c999"}, 
      "increments":
        { "3000c058-b8a7-4cff-915b-4979ef9a6ed9": {"counters" : "$counters"} }
    }
},
{upsert: true})

结果是:

{
    "_id" : ObjectId("61965aba1501d6eb40588ba0"),
    "keys" : {
        "country" : "US",
        "channel" : "c999"
    },
    "counters" : {
        "sale" : 10.0
    },
    "increments" : {
        "3000c058-b8a7-4cff-915b-4979ef9a6ed9" : {
            "counters" : "$counters"
        }
    }
}

是否可以进行这样的更新,即如何使用单个更新插入将增量结果从根对象 counters 复制到子对象 increments.3000c058-b8a7-4cff-915b-4979ef9a6ed9.counters。我想实施安全增量。也许你可以建议一些其他设计?

为了使用表达式,您的 $set 应该是聚合管道的一部分。所以你的查询应该看起来像

注意:我在更新中添加了方括号

db.getCollection('counterSets').update(
{ "$and" : [
    { "keys.country" : "US"}, 
    { "keys.channel" : "c999"}
  ]
},
[ {"$set": {"counters.sale": {"$sum":["$counters.sale", 10]}}}, {"$set": {"increments.x": "$counters"}}],
{upsert: true})

我还没有找到关于聚合管道原子性的任何信息,因此请谨慎使用。