Mongo单个upsert在c#中添加或更新字段

时间:2015-03-20 18:12:08

标签: c# mongodb

我试图做一些如果得到支持会很好的事情,但似乎不是。

我希望能够更新记录(如果存在),如果没有将字段设置为默认值。具体来说,我使用.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 =&gt; d.ListOfItems,new List&lt; Item&gt;())

  3. 但是,它会抛出一个错误,指出字段被指定两次。

    我可以(并且已经)通过首先进行搜索来修复此问题,如果没有找到,则使用第一条记录执行upsert。如果这会返回0个受影响的文档(其他人突然发现它)。然后我回退并执行upsert - 当然,如果文档存在,也会完成。

    有更清洁的方式吗?或者理想情况下,在一个命令中执行它?

1 个答案:

答案 0 :(得分:1)

仅当您希望某些内容仅适用于插入时,才需要SetOnInsert。在这种情况下,您希望AddToSet应用它是更新还是upsert。因此,如果您只使用AddToSet,它将完成您想要的任务。