我正在尝试将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"
}
]
}
答案 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());
<强>更新强>
$slice
加载嵌入数组并检查每个子文档的唯一性。