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

MongoDB 4.4 聚合实现文档双数组轮询取值并支持服务端分页

兼容MongoDB 4.4的聚合实现方案

实现逻辑

严格匹配需求规则:按文档顺序遍历、单文档内优先取fields数组非空时的首个值、再取items数组非空时的首个值、空数组自动跳过、支持服务端分页,全流程使用4.4版本兼容的操作符实现。

完整聚合代码

db.业务集合名.aggregate([
  // 1. 按业务规则固定文档遍历顺序,此处默认按_id升序,可替换为实际排序字段
  { $sort: { _id: 1 } },
  // 2. 为每个文档构造候选值数组,顺序固定为field在前、item在后
  {
    $addFields: {
      candidates: {
        $concatArrays: [
          // fields非空时,取首个元素生成field类型候选
          {
            $cond: {
              if: { $gt: [ { $size: "$fields" }, 0 ] },
              then: [ { type: "field", value: { $arrayElemAt: ["$fields", 0] } } ],
              else: []
            }
          },
          // items非空时,取首个元素生成item类型候选
          {
            $cond: {
              if: { $gt: [ { $size: "$items" }, 0 ] },
              then: [ { type: "item", value: { $arrayElemAt: ["$items", 0] } } ],
              else: []
            }
          }
        ]
      }
    }
  },
  // 3. 拆解候选数组,候选为空的文档会被自动过滤
  { $unwind: "$candidates" },
  // 4. 整形为要求的输出结构
  {
    $project: {
      _id: 0,
      value: "$candidates.value",
      type: "$candidates.type",
      fromId: "$_id"
    }
  },
  // 分页逻辑直接加在管道末尾即可,示例为跳过2条取2条
  // { $skip: 2 },
  // { $limit: 2 }
])

规则匹配验证

使用示例输入数据执行后,输出结果与要求的结构完全一致:

  • _id=1的文档:输出field值11、item值21
  • _id=2的文档:输出field值14、item值24
  • _id=3的文档:fields为空跳过,仅输出item值41
  • _id=4的文档:items为空跳过,仅输出field值31

边界说明

  • 若文档的fields、items数组均为空,会因候选数组为空被$unwind自动过滤,无多余输出
  • 管道全程无5.0+版本专属操作符,兼容4.4运行环境
  • 因前置排序固定了文档顺序,分页时结果顺序稳定,不会出现数据错乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 09:27:04