如何推送列表<>到mongodb的子文档?

时间:2011-06-03 20:27:23

标签: .net c#-4.0 mongodb mongodb-.net-driver

我正在尝试将List推送到文档的子文档。 如果我只插入一个对象作为BsonDocument,它的工作原理如下所示:

BsonDocument subdoc = new BsonDocument {
                 { "_id", ObjectId.GenerateNewId()},
                 {"name", "Mr Bob"}
                };

                var query = Query.EQ("_id", new ObjectId("1234.."));
                var upd = Update.Push("members", subdoc); <-works
                groups.Update(query, upd);

但我需要推送一个List。我得到了这个例外:

"WriteStartArray cannot be called when State is: Initial"

这是失败的代码:

List<BsonDocument> newMembers = new List<BsonDocument>();
BsonDocument subdoc  = new BsonDocument {
                     { "_id", ObjectId.GenerateNewId()},
                     {"name", "Mr Bob"}
                    };
newMembers.Add(subdoc );
subdoc = new BsonDocument {
                     { "_id", ObjectId.GenerateNewId()},
                     {"name", "Mr Tom"}
                    };                
newMembers.Add(subdoc);

var query = Query.EQ("_id", new ObjectId(id));
var upd = Update.Push("members", newMembers.ToBsonDocument()); <- EXCEPTION
groups.Update(query, upd);

插入后,我会看到:

groups:
{
  _id:1,
  members:[
   {   
      _id:1,
      name: "Mr Bob"
   },
   {   
      _id:1,
      name: "Mr Tom"
   }
  ]
}

1 个答案:

答案 0 :(得分:1)

由于newMembers已经列出BsonDocument,你不需要再将其转换为BsonDocument。

如果要将多个文档推送到嵌套数组,则需要使用$pushAll

var upd = Update.PushAll("members", newMembers.ToArray());

如果您需要某些类的推送列表项,您需要将每个项目转换为BsonDocument:

让我们说newMembers是List of Member类,那么如果你需要push List到嵌套数组,你应该这样做:

var upd = Update.PushAll("members", newMembers.Select(x=> x.ToBsonDocument()).ToArray());

<强>更新

  1. 要使子文档对于相同的用户名不唯一,您可以创建将从相同的用户名生成相同ID的算法。最简单的算法可以用下划线替换所有空格并制作ToLower()。
  2. 另一种方法是使用$slice加载嵌入数组并检查每个子文档的唯一性。