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
相关产品推荐
相关产品推荐

