我有一个包含以下数据的集合
{
"_id": "4e3951905e746b3805000000",
"Name": "John",
"Surname": "Mayer",
"Comments": [
{
"_id": "4e3951965e746b8007000001",
"content": "a"
}
]
}
例如我想del del一个id为4e3951965e746b8007000001的子文档所以这个子文档应该被删除
这是我的csharp代码
public static void UpdateContentById(string id)
{
var defination = Builders<Client>.Update.PullFilter(p => p.Comments, c => c.Id == "4e3951965e746b8007000001");
db.UpdateOne(p => p.Id == id, defination);
}
这是我期待的结果。
{
"_id": "4e3951905e746b3805000000",
"Name": "John",
"Surname": "Mayer"
}
答案 0 :(得分:1)
从数组中删除最后一个元素时,数组字段本身不会被删除。通常它是一种理想的行为。如果您有这样的模型:
public class Client
{
public ObjectId Id { get; set; }
public List<Comment> Comments { get; set; }
}
Comments
字段将被反序列化为空列表。与数据库文档中缺少Comments
字段的情况不同,在这种情况下,Comments
属性将保留为null
。这将需要对应用程序逻辑中的null
进行额外检查,否则可能导致NullReferenceException
。除非在构造对象时初始化列表:
public List<Comment> Comments { get; set; } = new List<Comment>();
现在Comments
将被设置为空列表,即使文档中缺少该属性也是如此。但是,这与文档中的Comments
数组刚刚为空时完全相同。
所以我在删除空数组字段时没有多大意义。但是,如果由于某种原因需要此行为,则应在元素拉取后自行执行另一个更新:
db.UpdateOne(p => p.Id == id, defination);
db.UpdateOne(p => p.Id == id && !p.Comments.Any(), Builders<Client>.Update.Unset(p => p.Comments));