MongoDB C#驱动程序upserting嵌套文档

时间:2013-06-25 14:11:40

标签: mongodb upsert

我在MongoDB中深深嵌入了文档,如下所示:

[
 {
  id : 1,
  stuff : [
           {
            id : 1,
            morestuff: [
                        {id : 1, text : "foo"},
                        {id : 2, text : "boo"}
                       ]
           },
           {
            id : 2,
            morestuff: [
                        {id : 1, text : "foo2"},
                        {id : 2, text : "boo2"}
                       ]
           } 
          ]
 }
]

我的C#表示如下:

class CoreElement
{
    public int id { get; set; }
    public List<Stuff> stuff { get; set; }
}
class Stuff
{
    public int id { get; set; }
    public List<MoreStuff> morestuff { get; set; }
}
class MoreStuff
{
    public int id { get; set; }
    public string text { get; set; }
}

现在我可以有不同的情况:

  1. 具有给定ID的CoreElement不存在
  2. 具有给定ID的资料不在CoreElement
  3. 的列表中
  4. MoreStuff不在CoreElement中的Stuff列表中
  5. 如果我创建这样的对象:

    CoreElement ce = new CoreElement();
    ce.id = 1;
    Stuff st = new Stuff();
    st.id = 2;
    MoreStuff ms = new MoreStuff();
    ms.id = 17;
    ms.text = "something";
    st.morestuff.Add(ms);
    ce.stuff.Add(st);
    

    有没有办法将它添加到我的集合中,以便将MoreStuff添加到相应的文档(如果已存在),或创建新文档(CoreElement或Stuff)(如果尚不存在)?

    任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:2)

尝试使用$addToSet

  

$ addToSet运算符仅在数值不在数组中时才向数组添加值。如果值在数组中,则$ addToSet返回而不修改数组。

您可以做的其他事情是加载您的CoreElement并在内存中使用它。您可以向对象添加Suffs和MoreStuffs,以使用C#检查重复项。完成对象后,只需保存它,MongoDB将用修改后的对象替换集合中的对象。