MongoDB v3.2 无关联的两个不同集合如何合并输出指定嵌套结构
MongoDB 3.2 跨集合合并查询实现方案
可直接对cities集合执行以下聚合查询,完全兼容MongoDB 3.2版本语法,无需使用map-reduce:
db.cities.aggregate([ // 合并所有城市到单个数组 { $group: { _id: null, Cities: { $push: "$$ROOT" } } }, // 新增临时字段硬编码国家为Turkey,用于关联时间集合 { $project: { Cities: 1, country: { $literal: "Turkey" } } }, // 关联dates集合获取土耳其对应时间 { $lookup: { from: "dates", localField: "country", foreignField: "_id", as: "dateInfo" } }, // 调整输出结构,符合要求 { $project: { _id: { $literal: ObjectId() }, // 生成新的ObjectId作为最终文档_id Cities: 1, DateTime: { $arrayElemAt: [ "$dateInfo.dateTime", 0 ] } } } ])
逻辑说明
- 第一步
$group将cities集合所有文档聚合为单条记录,所有城市信息存入Cities数组,不会产生冗余的时间字段到城市子项内 - 第二步通过
$literal生成固定值Turkey的临时关联字段,不需要cities集合内置国家字段 - 第三步
$lookup等值匹配dates集合中_id = "Turkey"的记录,获取对应的时间数据 - 第四步直接从关联结果数组中取出时间字段作为顶层属性,最终输出结构和要求完全一致
内容的提问来源于stack exchange,提问作者Tolga Cakir
相关产品推荐
相关产品推荐

