MongoDB 4.4以下版本如何替代$unionWith实现指定Post文档查询需求
低于MongoDB 4.4版本的实现方案
我们可以使用MongoDB 3.4及以上版本原生支持的$facet聚合算子实现相同效果,核心思路是在单次聚合任务中并行执行两个查询分支,再合并结果集,无需发起两次数据库请求。
完整实现代码
db.collection.aggregate([ // 预过滤符合两类条件的文档,减少后续计算的数据量 { "$match": { "$or": [ { "IsHomePage": true }, { "IsTagged": true } ] } }, // 并行执行两个查询分支 { "$facet": { // 分支1:获取所有首页文档 "homePosts": [ { "$match": { "IsHomePage": true } } ], // 分支2:获取最多50个非首页的打标文档,不需要随机采样可将$sample替换为$limit:50,性能更高 "taggedPosts": [ { "$match": { "IsHomePage": { "$ne": true }, "IsTagged": true } }, { "$sample": { "size": 50 } } ] } }, // 合并两个结果数组 { "$project": { "allPosts": { "$concatArrays": ["$homePosts", "$taggedPosts"] } } }, // 将数组合展开为独立文档 { "$unwind": "$allPosts" }, // 还原为原始Post文档结构 { "$replaceRoot": { "newRoot": "$allPosts" } } ])
补充说明
- 由于
IsHomePage为true和非true的条件互斥,合并后的结果不会出现重复文档,无需额外去重 - 如果你使用的MongoDB版本低于3.4,暂不支持单次聚合查询实现该需求,可分别执行两次查询后在应用层合并结果:
- 查询所有
IsHomePage: true的文档 - 查询最多50个
IsHomePage: {$ne: true}, IsTagged: true的文档 - 应用层将两个结果数组合并即可
- 查询所有
内容的提问来源于stack exchange,提问作者user1765862
相关产品推荐
相关产品推荐

