You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:39:02