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

MongoDB:如何过滤数组字段并获取数组最后一条数据?

如何在MongoDB中过滤数组后进行切片操作

你这段代码的错误确实出在$project阶段的queue字段上——同一个字段不能同时指定两个顶级聚合操作符($filter和$slice),MongoDB无法解析这种冲突的赋值逻辑。以下是两种可行的解决方法:

方法1:同一表达式嵌套过滤与切片

直接把$filter的结果作为$slice的输入,让两个操作按顺序执行:

[
  {
    $match: {
      _id: ObjectId("65a739bc29c608fd90b65038")
    }
  },
  {
    $project: {
      date: 1,
      serviceScheduleId: 1,
      serviceId: 1,
      branchOfficeId: 1,
      queue: {
        $slice: [
          {
            $filter: {
              input: "$queue",
              cond: { $eq: ["$$this.user.status", "waiting"] }
            }
          },
          1 // 取过滤后数组的前1个元素
        ]
      }
    }
  }
]

方法2:分阶段处理(更易读)

先用$addFields(或MongoDB 4.2+的$set)生成过滤后的临时数组,再在后续阶段对这个临时数组进行切片:

[
  {
    $match: {
      _id: ObjectId("65a739bc29c608fd90b65038")
    }
  },
  {
    $addFields: {
      // 生成过滤后的临时数组
      filteredQueue: {
        $filter: {
          input: "$queue",
          cond: { $eq: ["$$this.user.status", "waiting"] }
        }
      }
    }
  },
  {
    $project: {
      date: 1,
      serviceScheduleId: 1,
      serviceId: 1,
      branchOfficeId: 1,
      // 对临时数组切片
      queue: { $slice: ["$filteredQueue", 1] },
      // 可选:移除临时字段
      filteredQueue: 0
    }
  }
]

两种方法都能实现“先过滤数组中user.status为waiting的元素,再取过滤后数组的前1个元素”的需求,可根据代码可读性选择合适的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:32:19