【问题标题】:mongodb c# combining set operations conditionallymongodb c#有条件地组合集合操作
【发布时间】:2016-03-08 10:41:22
【问题描述】:

我正在寻找一种有条件地组合 Set 操作的方法。目前,如果不将它们一个接一个地连续点缀,我就无法增加更新的定义。

例如。而不是:

    Builders<BsonDocument>.Update.Set("someElement.Length", b.Length)
.Set("someElement.Path", b.Path)

我正在尝试找到一种方法来使用某些东西,但徒劳无功:

var update = Builders<BsonDocument>.Update;
bool hasChanged = false;
if (a.Length != b.Length)
{
    hasChanged = true;
    update.Set("someElement.Length", b.Length)
}
if (a.Path != b.Path)
{
    hasChanged = true;
    update.Set("someElement.Path", b.Path)
}

if (hasChanged)
    await someCollection.UpdateOneAsync(Builders<someModel>.Filter.Eq("_id", a.Id), update);

有没有办法做到这一点,还是我在天空中追逐馅饼?我不想替换整个文档,只想更新已更改的字段。

【问题讨论】:

  • 为什么不直接构建 BSON 文档进行更新,而不是使用助手?作为 BSON 文档,顶级键是 "$set",该操作的所有字段都是该键的子项。它基本上只是一个哈希/映射,因此与添加/构造任何这些方法相同。这实际上是所有像Set() 这样的“帮助”函数都在做的事情。
  • 好吧听起来很有趣,所以它会是 { $set: { someElement.length: B.length, someElement.path: b.path } } 等等,而不是实际值。如果是这样,那么你的权利。这要容易得多,我可以很容易地看到这样的功能有多强大。
  • 我知道文档遵循“shell”约定,因此示例采用 JSON 格式,但如果您基本上认为最终的 BSON 看起来几乎相同(抽象而言),那么它只是一个建设事宜。熟悉核心文档比熟悉驱动程序文档要好得多。见$set。我当然是对的。
  • 感谢您的建议,我并没有质疑您的准确性,只是我的解释。我将更多地关注核心文档。赞赏。顺便提一句。如果您可以写一个示例作为答案,我可以将您的答案标记为解决方案。

标签: mongodb c#-3.0 mongodb-.net-driver


【解决方案1】:

UpdateDefinition 是一个不可变对象,因此对它们的链接操作每次都会不断创建一个新对象。要有条件地执行此操作,您需要将结果分配回自身,就像 LINQ 一样。

update = update.Set(...);

【讨论】:

    【解决方案2】:

    如果您维护有条件创建的 UpdateDefinition 的集合,则可以将该集合传递给 Combine 运算符以创建最终的 UpdateDefinition。

    您可以找到有关此类似问题的示例:C# MongoDB Driver - How to use UpdateDefinitionBuilder?

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 2020-04-28
      • 2018-02-15
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多