C#中MongoDB多分组子集查询实现方法咨询
解决MongoDB多分组子集查询的C#代码修改方案
当前代码的问题在于,把所有分组的条件合并成了一个And逻辑,导致多分组查询时变成了同时满足所有分组的条件,而不是满足任意一个分组的条件。正确的逻辑应该是:每个分组内的层级条件(国家/城市/地区)用And关联,多个分组之间用Or关联。
修改后的代码如下:
public async Task<List<List<ObjectId>>> UsersByGroupIdV3(List<List<string>> targetGroupses) { // 存储每个分组对应的And过滤条件 List<FilterDefinition<User>> groupFilters = new List<FilterDefinition<User>>(); foreach (var targetGroups in targetGroupses) { List<FilterDefinition<User>> singleGroupConditions = new List<FilterDefinition<User>>(); // 构建单个分组内的条件(And逻辑) if (targetGroups[0] != "allcountry") { singleGroupConditions.Add(Builders<User>.Filter.Eq(x => x.GroupIds[0], new ObjectId(targetGroups[0]))); } if (targetGroups[1] != "allCity") { singleGroupConditions.Add(Builders<User>.Filter.Eq(x => x.GroupIds[1], new ObjectId(targetGroups[1]))); } if (targetGroups[2] != "allDistrict") { singleGroupConditions.Add(Builders<User>.Filter.Eq(x => x.GroupIds[2], new ObjectId(targetGroups[2]))); } // 如果当前分组有有效条件,就加入到分组过滤器列表 if (singleGroupConditions.Any()) { groupFilters.Add(Builders<User>.Filter.And(singleGroupConditions)); } } // 多个分组条件用Or组合 var match = groupFilters.Any() ? Builders<User>.Filter.Or(groupFilters) : Builders<User>.Filter.Empty; var users = await _userRepository.Find(match); var group = users.Result.Select(i => i.GroupIds); return group.ToList(); }
关键修改点说明
- 新增
singleGroupConditions列表,用于存储单个分组内的所有过滤条件,每个分组内的条件用And组合,确保该分组的层级条件同时满足。 - 用
groupFilters列表收集每个分组的And条件,最后将这些分组条件用Or组合,实现「满足任意一个分组即可匹配」的查询逻辑。 - 增加空判断:如果某个分组没有有效条件(比如全选了
allcountry/allCity/allDistrict),则跳过该分组;如果所有分组都无有效条件,返回空过滤器(匹配所有数据)。
内容的提问来源于stack exchange,提问作者Mehmet Ceylan
相关产品推荐
相关产品推荐

