可以进行部分更新,但在mongodb中完成文档更新吗?

时间:2019-05-06 14:03:35

标签: mongodb mongodb-query mongodb-.net-driver

使用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字段或更改任何其他数据。

要以编程方式执行此操作,我必须从文档中删除_idvalue字段,才能将其用作$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#示例:)

实现有条件更新单个字段的概念,但是同时插入完整的文档(如果尚不存在)的最干净,有效的方法是什么?

欢迎使用除我正在尝试之外的其他方法。

0 个答案:

没有答案