You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#中MongoDB嵌套孙级文档删除查询失效问题求助

C#中MongoDB嵌套孙级文档删除查询失效问题求助

我最近一直在折腾MongoDB的删除查询,场景是在强类型的嵌套结构里删除指定的孙级文档——结构是Parent包含Child数组,Child又包含Grandchild数组,我要删某个Parent下某个Child里的特定Grandchild。现在的问题是,执行后MatchedCount是1,但ModifiedCount一直是0,数据根本没删掉。试了N种写法,包括MongoDB官方AI给的方案,都不管用,快愁死了!

先贴一下我的实体结构:

public class Parent 
{ 
    public string Id {get; set;} 
    public Child[] Children {get; set;} 
} 
public class Child 
{ 
    public Guid Id {get; set;} 
    public Grandchild[] Grandchildren {get; set;} 
} 
public class Grandchild 
{ 
    public Guid Id {get; set;} 
    public string Name {get; set;} 
}

然后是我之前失败的尝试代码:

var filter = Builders<Parent>.Filter.Eq(x => x.Id, parentId);
var update = Builders<Parent>.Update.Pull(
    "Children.$[child].GrandChildren", 
    Builders<GrandChild>.Filter.Eq(gc => gc.Id, Guid.Parse(grandChildId))
);
var arrayFilters = new List<ArrayFilterDefinition> 
{ 
    new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("child._id", childId)) 
};
var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };
var result = await _parentCollection.UpdateOneAsync(filter, update, updateOptions);
return result.ModifiedCount == 1;

删除/更新Child层级的操作都很顺利,但到Grandchild这里就卡壳了,完全摸不着头脑,有没有大佬能帮我看看哪里错了?


编辑:终于解决了!
折腾了整整3天,反复调整MongoDB AI给的方案,终于搞出能用的代码了。给同样踩坑的朋友参考:

var filter = Builders<Parent>.Filter.And(
    Builders<Parent>.Filter.Eq(p => p.Id, parentId),
    Builders<Parent>.Filter.ElemMatch(p => p.Children, c => c.Id == Guid.Parse(childId))
);
var update = Builders<Parent>.Update.PullFilter(
    "Children.$.GrandChildren", 
    Builders<GrandChild>.Filter.Eq(gc => gc.Id, Guid.Parse(grandChildId))
);
var result = await _parentCollection.UpdateOneAsync(filter, update);
return result.ModifiedCount == 1;

说真的,用了25年T-SQL,从来没想到这么个简单的需求能折腾这么久,果然隔行如隔山,搞懂了之后又觉得其实挺简单的😂

火山引擎 最新活动