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

MongoDB:如何按数组中指定对象的字段对文档排序

MongoDB查询:筛选含特定food.name的文档并按对应price排序

要实现筛选出包含指定food.name的文档,并按该食品对应的price排序,最可靠的方式是使用聚合管道——普通find查询无法直接针对数组内的特定元素进行排序。以下是针对示例需求(查找food.name="steak"的文档并按其price升序排序)的具体实现:

完整聚合查询代码

db.yourCollectionName.aggregate([
  // 1. 过滤出包含目标食品的文档
  { $match: { "food.name": "steak" } },
  // 2. 提取目标食品的price作为临时排序字段
  {
    $addFields: {
      targetPrice: {
        $getField: {
          field: "price",
          input: {
            $arrayElemAt: [
              {
                $filter: {
                  input: "$food",
                  cond: { $eq: ["$$this.name", "steak"] }
                }
              },
              0
            ]
          }
        }
      }
    }
  },
  // 3. 按临时字段升序排序(降序改为-1)
  { $sort: { targetPrice: 1 } },
  // 4. 移除临时字段,保持原文档结构
  { $project: { targetPrice: 0 } }
])

代码说明

  1. $match阶段:快速过滤出所有包含food.name="steak"的文档,减少后续处理的数据量。
  2. $addFields阶段:
    • 使用$filter从food数组中筛选出name等于"steak"的元素;
    • 用$arrayElemAt取筛选结果的第一个元素(假设每个文档中同一食品名称仅出现一次);
    • 通过$getField提取该元素的price值,存入临时字段targetPrice。
  3. $sort阶段:根据临时字段targetPrice进行升序排序,若需要降序排列,将值改为-1即可。
  4. $project阶段:移除临时字段targetPrice,返回与原文档结构一致的结果。

灵活调整

如果需要查询其他食品(比如"soup"),只需将代码中两处的"steak"替换为目标食品名称即可。

内容的提问来源于stack exchange,提问作者Fretzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:01:22