MongoDB关联两集合查询 替换createdBy/updatedBy为test2对应fullName
MongoDB 跨集合字段关联替换实现方案
要实现test1集合全量查询、将createdBy/updatedBy存储的用户ID替换为test2集合对应用户的fullName,直接使用MongoDB聚合管道的$lookup阶段做两次关联,再做字段映射即可,不需要额外写代码层处理逻辑。
可直接执行的聚合语句
db.test1.aggregate([ // 关联创建人信息 { $lookup: { from: "test2", localField: "createdBy", foreignField: "_id", as: "createdUserInfo" } }, // 关联更新人信息 { $lookup: { from: "test2", localField: "updatedBy", foreignField: "_id", as: "updatedUserInfo" } }, // 重映射字段,替换ID为用户名,剔除临时关联字段 { $project: { _id: 1, dateCreated: 1, dateModified: 1, data1: 1, data2: 1, data3: 1, createdBy: { $first: "$createdUserInfo.fullName" }, updatedBy: { $first: "$updatedUserInfo.fullName" } } } ])
注意事项
- 上述语法兼容MongoDB 3.2及以上所有正式版本,
$first数组取首元素的写法在4.4+版本支持,如果是更低版本,可以替换为{ $arrayElemAt: ["$createdUserInfo.fullName", 0] }实现相同效果 - test2集合默认会给
_id字段创建唯一索引,关联查询时不需要额外给test2建索引;如果test1集合数据量超过10万条,建议给createdBy、updatedBy字段分别创建普通索引,能明显降低查询耗时 - 如果出现test1里存储的用户ID在test2中不存在的情况,对应替换后的
createdBy/updatedBy字段会返回null,如果需要兜底默认值,可以在$project阶段用$ifNull指定,比如createdBy: { $ifNull: [{ $first: "$createdUserInfo.fullName" }, "未知用户"] }
内容的提问来源于stack exchange,提问作者shivlal kumavat
相关产品推荐
相关产品推荐

