【发布时间】: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);
我的期望:
更新时只需将记录添加到现有列表的末尾即可。
如果它不存在,让它执行以下操作之一:
- 将该字段设置为该值,并忽略更新。
-
将字段设置为值,然后进行更新。 (所以,我会更改代码来做
SetOnInsert(d => d.ListOfItems, new List
- ())
但是相反,它会抛出一个错误,即该字段被指定了两次。
我可以(并且已经)通过首先进行搜索来解决此问题,如果未找到,则对第一条记录进行更新插入。如果返回 0 个受影响的文档(其他人更新了它。)然后我回退并执行 upsert - 当然,如果文档存在,也会这样做。
有没有更清洁的方法?或者理想情况下,在一个命令中完成?
【问题讨论】:
-
也许你可以更清楚一点,因为我对你正在寻找的结果有点困惑。您能否提供更新后的集合应该是什么样的,以及更新后的集合应该是什么样的?这样,我们就可以非常清楚地知道您期望发生什么。
-
在第一种情况下,我会遇到以下两种情况之一:1)根本不存在记录。或 2) 存在记录。如果存在,我想 'SetOnInsert(...) 将新项目添加到文档中的列表中。如果没有,我想在列表中添加一个包含该新项目的新文档 (ListOfItems) - 不确定我能做到多清楚
-
所以,不要使用 SetOnInsert。在 upsert 的情况下, AddToSet 将完全执行 SetOnInsert 正在执行的操作...这就是我感到困惑的原因,因为看起来您实际上想要的行为与此默认行为不同。
-
啊,太棒了!谢谢 - 将其更改为答案,我会将其标记为正确答案。