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

MongoDB单查询请求:返回不同文档的不同字段并按身高排序

解决方案:MongoDB聚合实现差异化字段返回+排序

嘿,这个需求刚好能用MongoDB的聚合框架一次性搞定,不用多次查询折腾。下面是具体的实现思路和完整代码:

核心逻辑拆解

我们需要分三个阶段处理数据,一步步达成目标:

  1. 先按height从小到大排序,确保最矮的文档排在第一位
  2. 给排序后的每个文档加个行号标记,用来区分第一个文档和其他文档
  3. 根据行号决定返回字段:行号为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:37:06