mongodb 第一次推送时出现 C# 错误

mongodb C# error on first Push

我有一个 Parent 实体,它有 属性 个 Child 实体列表。最初在插入时我没有 child 实体的值。

但是当我尝试使用 Child 实体更新(通过调用推送)文档时失败了。
当我将虚拟 child 实体值插入 Initial Add .

时,这会起作用

这是因为嵌入文档引用了 null 。

public class ParentDocument : Entity
{

    public string prop1 { get; set; }        
    public List<EmbeddedDocument> EmbeddedDocuments { get; set; }
}
public class EmbeddedDocument
{
    public string prop2{ get; set; }

}  

先保存parent

_collection.InsertOne(new ParentDocument(){prop1 ="value"});

以及稍后我更新文档时

var builder = Builders<ParentDocument>.Update;
var updateDefintion = builder.Push(x => x.EmbeddedDocuments ,new EmbeddedDocument() { prop2= "value2" });
 _collection.UpdateManyAsync(x=>x.Id==ParentDocumentId, updateDefinition)

发生错误"A write operation resulted in an error mongodb"

但是如果我在第一次插入时已经在列表中插入了嵌入式文档,则此推送有效。
我认为这是因为 EmbeddedDocuments 属性 被插入为 null 推送不起作用。

我也试过将空列表传递给初始插入,但没有帮助。

一个想法是检查嵌入式文档列表的计数是否为零并调用

Builder.set(x=>x.EmbeddedDocuments ,new List<EmbeddedDocument>(){ item1 });

但这会花费一个查询,我不想这样做。

还有其他解决办法吗?

提前致谢

猜测一下,这是因为数据库中的"array"字段在插入后为空。您要么需要将数据库中的初始值设为空数组,要么需要使其不存在。您可以:

  • 在列表字段中使用 [BsonIgnoreIfDefault] 属性不存储空值,
  • 将您的列表字段初始化为空列表以存储空数组

这可以很容易地在 shell 中复制:

> db.so.insert({x:1, y: null})
> db.so.update({x:1}, {$push: { y: "funny" }})

这会出错。但是,如果你从插入中删除y或者将其更改为空数组,则更新将成功。