使用mongoDB,我想有条件地更新特定字段(如果现有值小于update,则更新字段)。但是,如果该文档不存在,我希望将整个文档插入。
我以前曾使用$ max(用于设置字段)和$ setOnInsert(用于设置文档的其余部分)的组合,来实现我想要的功能。
这防止将来的更新减少给定字段。例如,具有以下文档架构:
{
_id: [ObjectId]
key: [string],
foo: [string],
bar: [string],
value: [number]
}
我的更新看起来像这样:
db.collection.update(
{ key: "something unique" },
{
$max : { value: 100 },
$setOnInsert: {
key: "something unique",
foo: "yes",
bar: "probably"
}
},
{ upsert: true }
)
第一次更新将使用给定的value
创建文档,而所有后续更新将永远不会减少value
字段或更改任何其他数据。
要以编程方式执行此操作,我必须从文档中删除_id
和value
字段,才能将其用作$setOnInsert
。可以忍受的。
现在-我想将某些字段(包括value
)移到嵌入式文档中。所以我的文档架构现在看起来像这样:
{
key: [string],
data: {
foo: [string],
bar: [string],
value: [number]
}
}
尝试使用类似的想法进行更新,我尝试这样做:
db.collection.update(
{ key: "something unique" },
{
$max : { "data.value": 100 },
$setOnInsert: {
key: "something unique",
data: {
foo: "yes",
bar: "probably"
}
}
},
{ upsert: true }
)
但是,以下MongoError: Updating the path 'data' would create a conflict at 'data'
失败了。
我可以使用点符号使其工作:
db.collection.update(
{ key: "something unique" },
{
$max : { "data.value": 100 },
$setOnInsert: {
key: "something unique",
"data.foo": "yes",
"data.bar": "probably"
}
},
{ upsert: true }
)
但是,我认为以编程方式构建此更新有些混乱。不过,还是欢迎一些C#示例:)
实现有条件更新单个字段的概念,但是同时插入完整的文档(如果尚不存在)的最干净,有效的方法是什么?
欢迎使用除我正在尝试之外的其他方法。