mongodb首次推送时出现C#错误

时间:2015-06-09 10:54:19

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

我有一个父实体,它具有子实体列表的属性。最初在插入时我没有子实体的值。

但是当我尝试更新(通过调用push)带有子实体的文档时,它失败了 当我将一个虚拟子实体值插入初始添加时,这是有效的。

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

public class ParentDocument : Entity
{

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

}  

父亲保存第一

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

错误发生“写入操作导致错误mongodb”

但是如果我已经在第一次插入时在List中插入了嵌入文档,那么这种推动是有效的 我认为这是因为EmbeddedDocuments属性是Inserted as null,push不起作用。

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

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

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

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

还有其他解决方案吗?

先谢谢

1 个答案:

答案 0 :(得分:1)

为了猜测,它是因为&#34;阵列&#34;插入后数据库中的字段为空。您需要将数据库中的初始值设为空数组,或者需要使其不存在。你可以:

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

这可以很容易地在shell中重现:

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

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