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 } } ])
逻辑说明
- 收集所有唯一日期:通过
$concatArrays合并两个数组的日期字段,再用$reduce去重,得到完整的日期集合,确保不会遗漏任何一边的日期。 - 按日期合并数据:用
$map遍历所有日期,对每个日期分别从两个数组中筛选对应数据,最后用$mergeObjects合并。如果某一边没有对应日期的数据,$first会返回null,合并后仅保留存在的字段,不会丢失attendances中独有的数据。
内容的提问来源于stack exchange,提问作者chirag prajapati
相关产品推荐
相关产品推荐

