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

MongoDB数组对象合并问题:缺失一方数据时无法保留有效数据

MongoDB合并两个数组时保留仅存在于attendances中的日期数据

原方案仅基于shiftListData中的日期进行合并,导致attendances里独有的日期数据被遗漏。要解决这个问题,需要先收集两个数组中所有的唯一日期,再针对每个日期匹配两边的数据进行合并:

聚合管道解决方案

db.collection.aggregate([
  // 生成两个数组中所有唯一日期的列表
  {
    $set: {
      allDates: {
        $reduce: {
          input: { $concatArrays: ["$shiftListData.date", "$attendances.date"] },
          initialValue: [],
          in: {
            $cond: [
              { $in: ["$$this", "$$value"] },
              "$$value",
              { $concatArrays: ["$$value", ["$$this"]] }
            ]
          }
        }
      }
    }
  },
  // 遍历所有日期,合并对应的数据
  {
    $set: {
      mergedData: {
        $map: {
          input: "$allDates",
          as: "date",
          in: {
            $mergeObjects: [
              // 从shiftListData匹配当前日期的数据
              { $first: { $filter: { input: "$shiftListData", cond: { $eq: ["$$this.date", "$$date"] } } } },
              // 从attendances匹配当前日期的数据
              { $first: { $filter: { input: "$attendances", cond: { $eq: ["$$this.date", "$$date"] } } } }
            ]
          }
        }
      }
    }
  },
  // 移除临时生成的allDates字段(可选)
  { $project: { allDates: 0 } }
])

逻辑说明

  1. 收集所有唯一日期:通过$concatArrays合并两个数组的日期字段,再用$reduce去重,得到完整的日期集合,确保不会遗漏任何一边的日期。
  2. 按日期合并数据:用$map遍历所有日期,对每个日期分别从两个数组中筛选对应数据,最后用$mergeObjects合并。如果某一边没有对应日期的数据,$first会返回null,合并后仅保留存在的字段,不会丢失attendances中独有的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:55:20