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})
我还没有找到关于聚合管道原子性的任何信息,因此请谨慎使用。
我正在使用 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})
我还没有找到关于聚合管道原子性的任何信息,因此请谨慎使用。