我有一个父实体,它具有子实体列表的属性。最初在插入时我没有子实体的值。
但是当我尝试更新(通过调用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 });
但这会花费一个查询,我不想这样做。
还有其他解决方案吗?
先谢谢
答案 0 :(得分:1)
为了猜测,它是因为&#34;阵列&#34;插入后数据库中的字段为空。您需要将数据库中的初始值设为空数组,或者需要使其不存在。你可以:
这可以很容易地在shell中重现:
> db.so.insert({x:1, y: null})
> db.so.update({x:1}, {$push: { y: "funny" }})
这会出错。但是,如果从插入中删除y或将其更改为空数组,则更新将成功。