MongoDB单查询请求:返回不同文档的不同字段并按身高排序
解决方案:MongoDB聚合实现差异化字段返回+排序
嘿,这个需求刚好能用MongoDB的聚合框架一次性搞定,不用多次查询折腾。下面是具体的实现思路和完整代码:
核心逻辑拆解
我们需要分三个阶段处理数据,一步步达成目标:
- 先按
height从小到大排序,确保最矮的文档排在第一位 - 给排序后的每个文档加个行号标记,用来区分第一个文档和其他文档
- 根据行号决定返回字段:行号为1的返回全部内容,其他仅保留
name字段
完整聚合查询代码
db.turtles.aggregate([ // 第一步:按height升序排序,把最矮的文档放在首位 { $sort: { height: 1 } }, // 第二步:给每个文档添加行号,第一个文档行号为1 { $set: { rowNum: { $rowNumber: {} } } }, // 第三步:根据行号筛选返回字段,同时移除临时的rowNum字段 { $project: { name: 1, height: { $cond: [{ $eq: ["$rowNum", 1] }, "$height", "$$REMOVE"] }, weapon: { $cond: [{ $eq: ["$rowNum", 1] }, "$weapon", "$$REMOVE"] }, favorite_pizza: { $cond: [{ $eq: ["$rowNum", 1] }, "$favorite_pizza", "$$REMOVE"] }, rowNum: 0 } } ])
代码细节解释
- $sort阶段:
{ $sort: { height: 1 } }会将文档按height从小到大排列,确保Leonardo(height=180)处于结果的第一位。 - $set阶段:使用窗口函数
$rowNumber给排序后的每个文档分配递增行号,第一个文档行号为1,后续依次是2、3、4,这个标记用来识别需要返回全量字段的文档。 - $project阶段:通过
$cond条件判断,当rowNum等于1时保留对应字段,否则用$$REMOVE移除该字段;最后把临时的rowNum字段也移除,避免出现在最终结果里。
执行结果验证
运行这个查询后,你会得到完全符合需求的输出:
[ { "name": "Leonardo", "height": "180", "weapon": "sword", "favorite_pizza": "Hawai" }, { "name": "Donatello" }, { "name": "Michelangelo" }, { "name": "Raphael" } ]
内容的提问来源于stack exchange,提问作者yodalr
相关产品推荐
相关产品推荐

