C#使用MongoDB驱动判断List<Guid>是否包含Guid并过滤数据
实现方案
你原来写的三元表达式写法无法被MongoDB C#驱动正确解析为原生查询语句,会抛出表达式转换异常,推荐使用驱动内置的Nin(Not In)运算符实现数据库层面的过滤:
步骤1:先获取当前用户的跳过ID列表
// Skip类定义 public class Skip : BaseModel { public Guid UserID { get; set; } public List<Guid> SkippedIDs { get; set; } } // 查询当前用户的跳过记录 var skippedMe = await SkipCollection.Aggregate().Match(s => s.UserID == profile.Id).FirstAsync(); // 处理空引用、空列表的边界情况 var skippedIds = skippedMe?.SkippedIDs ?? new List<Guid>();
步骤2:构造过滤条件执行聚合查询
var profileFilter = Builders<Profile>.Filter.Empty; // 仅当有需要跳过的ID时追加过滤条件,避免无意义的查询运算 if (skippedIds.Any()) { profileFilter &= Builders<Profile>.Filter.Nin(p => p.Id, skippedIds); } // 执行聚合查询,过滤后的结果直接返回 var filteredProfiles = await ProfileCollection.Aggregate() .Match(profileFilter) // 可在这里追加其他聚合阶段,比如分页、排序、关联查询等 .ToListAsync();
实现说明
Nin运算符会被驱动自动翻译为MongoDB原生的$nin查询指令,所有过滤逻辑都在数据库层面执行,不需要拉取全量Profile数据到内存再过滤,性能远高于内存过滤。- 提前判断跳过列表是否为空,没有需要跳过的用户时不会额外增加查询开销。
内容的提问来源于stack exchange,提问作者Rakesh Ravi G
相关产品推荐
相关产品推荐

