【问题标题】:Mongo single upsert to add or update a field in c#Mongo 单 upsert 在 C# 中添加或更新字段
【发布时间】:2015-03-20 18:12:07
【问题描述】:

我正在尝试做一些事情,如果它受到支持会很好,但似乎不支持。

如果记录存在,我希望能够更新记录,如果不存在,则将字段设置为默认值。具体来说,我使用 .AddToSet() 将对象附加到列表中。

这不起作用:

     UpdateBuilder<TestDocument> update = Update<TestDocument>
        .Set(d => d.UpdatedOn, DateTime.Now)
        .SetOnInsert(d => d.ListOfItems, new List<Item> () {ItemToAdd})
        .AddToSet(d => d.ListOfItems, ItemToAdd);

  TestCollection.Update(query,update, UpdateFlags.Upsert); 

我的期望:

更新时只需将记录添加到现有列表的末尾即可。

如果它不存在,让它执行以下操作之一:

  1. 将该字段设置为该值,并忽略更新。
  2. 将字段设置为值,然后进行更新。 (所以,我会更改代码来做

    SetOnInsert(d => d.ListOfItems, new List ())

但是相反,它会抛出一个错误,即该字段被指定了两次。

我可以(并且已经)通过首先进行搜索来解决此问题,如果未找到,则对第一条记录进行更新插入。如果返回 0 个受影响的文档(其他人更新了它。)然后我回退并执行 upsert - 当然,如果文档存在,也会这样做。

有没有更清洁的方法?或者理想情况下,在一个命令中完成?

【问题讨论】:

  • 也许你可以更清楚一点,因为我对你正在寻找的结果有点困惑。您能否提供更新后的集合应该是什么样的,以及更新后的集合应该是什么样的?这样,我们就可以非常清楚地知道您期望发生什么。
  • 在第一种情况下,我会遇到以下两种情况之一:1)根本不存在记录。或 2) 存在记录。如果存在,我想 'SetOnInsert(...) 将新项目添加到文档中的列表中。如果没有,我想在列表中添加一个包含该新项目的新文档 (ListOfItems) - 不确定我能做到多清楚
  • 所以,不要使用 SetOnInsert。在 upsert 的情况下, AddToSet 将完全执行 SetOnInsert 正在执行的操作...这就是我感到困惑的原因,因为看起来您实际上想要的行为与此默认行为不同。
  • 啊,太棒了!谢谢 - 将其更改为答案,我会将其标记为正确答案。

标签: c# mongodb


【解决方案1】:

SetOnInsert 仅在您希望某些内容仅适用于插入时才需要。在这种情况下,无论是更新还是更新插入,您都希望 AddToSet 应用。所以,如果你只使用 AddToSet,它会完成你想要的。

【讨论】:

    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 2019-05-06
    相关资源
    最近更新 更多