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

发布于 2024-11-11 17:06:53 字数 1349 浏览 4 评论 0 原文

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

但我需要推送一个列表。我收到此异常:

"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"
   }
  ]
}

I am trying to push a List to the subdocument of a document.
If I insert just a single object as BsonDocument it works as shown below:

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);

But I need to push a List. I am getting this exception:

"WriteStartArray cannot be called when State is: Initial"

This is the code that is failing:

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);

After the insertion, I would see:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

思慕 2024-11-18 17:06:53

由于 newMembers 已经是 BsonDocument 列表,因此您无需再次将其转换为 BsonDocument。

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

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

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

假设 newMembers 是 Member 类的 List,那么如果您需要将 List 推送到嵌套数组,您应该做一些事情像这样:

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

更新:

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

Since newMembers already List of BsonDocument you no need convert it to BsonDocument again.

If you want push more than one document to the a nested array you need to use $pushAll:

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

In case if you will need push List items of some class you need convert each item to BsonDocument:

Lets say that newMembers is List of Member class, then if you need push List to a nested array you should do something like this:

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

Update:

  1. To make subdocument not unique for same user names you can create algoritm that will generate same id from same user names. Most simple algoritm can just replace all spaces with underscore and make ToLower().
  2. Another way load embedd array with $slice and check uniqueness of each subdocument.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文