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或者将其更改为空数组,则更新将成功。
我有一个 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或者将其更改为空数组,则更新将成功。