MongoDB中如何组合两个IsHomePage筛选条件实现单次聚合查询
问题背景
现有Page类定义如下:
public class Page { public string Title {get;set;} public bool IsHomePage {get;set;} }
仓储层原检索文档的写法:
return await db.myCollection .Aggregate() .Match(filter) .ToListAsync();
目前需要查询所有IsHomePage为true和IsHomePage为false的文档,原有实现为两次独立查询:
var filter = Builders<Post>.Filter.Eq(x => x.IsHomePage, true); var homePageDocsFilter = await db.myCollection .Aggregate() .Match(filter) .ToListAsync(); var filter2 = Builders<Post>.Filter.Eq(x => x.IsHomePage, false); var otherDocs = await db.myCollection .Aggregate() .Match(filter2) .ToListAsync();
需求是将两个筛选条件合并为一个组合过滤器,实现单次聚合查询返回所有匹配结果。
解决方案
使用MongoDB .NET驱动提供的Or逻辑运算符拼接两个等值条件即可得到组合过滤器:
var COMBINED_FILTER = Builders<Post>.Filter.Or( Builders<Post>.Filter.Eq(x => x.IsHomePage, true), Builders<Post>.Filter.Eq(x => x.IsHomePage, false) );
之后就可以用你预期的写法单次查询全量数据:
return await db.myCollection .Aggregate() .Match(COMBINED_FILTER) .ToListAsync();
如果需要后续区分首页和其他文档,拿到全量结果后可直接在内存分组,避免两次数据库请求:
var allDocs = await db.myCollection.Aggregate().Match(COMBINED_FILTER).ToListAsync(); // 内存拆分两类数据 var homePageDocs = allDocs.Where(x => x.IsHomePage).ToList(); var otherDocs = allDocs.Where(x => !x.IsHomePage).ToList();
注:如果
IsHomePage字段不存在null值,上述组合过滤器等价于查询所有包含该字段的文档,你也可以根据实际业务场景替换为Exists条件,写法和原有两次查询的返回结果完全一致。
内容的提问来源于stack exchange,提问作者user1765862
相关产品推荐
相关产品推荐

