.net 如何推送列表<&燃气轮机;到mongodb中的子文档?

.net 如何推送列表<&燃气轮机;到mongodb中的子文档?,.net,c#-4.0,mongodb,mongodb-.net-driver,.net,C# 4.0,Mongodb,Mongodb .net Driver,我正在尝试将列表推送到文档的子文档。 如果我只插入一个对象作为BsonDocument,它的工作原理如下所示: BsonDocument subdoc = new BsonDocument { { "_id", ObjectId.GenerateNewId()}, {"name", "Mr Bob"} }; var query = Query.EQ("_id",

我正在尝试将列表推送到文档的子文档。 如果我只插入一个对象作为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<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);

由于新成员已经列出了
BsonDocument
,您无需再次将其转换为BsonDocument

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

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

假设newMembers是成员类的列表,那么如果需要将列表推送到嵌套数组,则应执行以下操作:

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

  • 若要使子文档对于相同的用户名不唯一,您可以创建算法,该算法将从相同的用户名生成相同的id。最简单的算法就是用下划线替换所有空格,并使ToLower()为空
  • 另一种方法是使用
    $slice
    加载嵌入数组,并检查每个子文档的唯一性
    有没有办法检查副本?其中一个新条目可能具有子文档中已存在的name=“Mr Bob”。有没有办法在$addToSet中检查这种情况?@Projapati:没有办法使用
    push
    。为什么不直接使用$addToSet?就像一个符咒。我不得不添加.ToBsonDocument(),因为它没有语法错误。我想关键是要整理。感谢Andrew。AddToSetEach()似乎插入了重复项,因为每个成员都有不同的_id(ObjectId.generateWid),即使名称相同。这使得每个子文档都是唯一的。是否仅从列表中推送名称字段中具有不同值的内容?
    groups:
    {
      _id:1,
      members:[
       {   
          _id:1,
          name: "Mr Bob"
       },
       {   
          _id:1,
          name: "Mr Tom"
       }
      ]
    }
    
    var upd = Update.PushAll("members", newMembers.ToArray());
    
    var upd = Update.PushAll("members", newMembers.Select(x=> x.ToBsonDocument()).ToArray());