我试图做一些如果得到支持会很好的事情,但似乎不是。
我希望能够更新记录(如果存在),如果没有将字段设置为默认值。具体来说,我使用.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 =&gt; d.ListOfItems,new List&lt; Item&gt;())
但是,它会抛出一个错误,指出字段被指定两次。
我可以(并且已经)通过首先进行搜索来修复此问题,如果没有找到,则使用第一条记录执行upsert。如果这会返回0个受影响的文档(其他人突然发现它)。然后我回退并执行upsert - 当然,如果文档存在,也会完成。
有更清洁的方式吗?或者理想情况下,在一个命令中执行它?
答案 0 :(得分:1)
仅当您希望某些内容仅适用于插入时,才需要SetOnInsert。在这种情况下,您希望AddToSet应用它是更新还是upsert。因此,如果您只使用AddToSet,它将完成您想要的任务。