Node.js中MongoDB $lookup未返回预期结果问题求助
MongoDB聚合查询在Node.js环境下关联字符串ID数组与ObjectId集合失败的解决方案
问题背景
需要关联两个MongoDB集合:prefix集合的categoryId字段为字符串ID数组,categories集合的_id为ObjectId类型。在Mongo Playground中可正常运行的聚合查询,在Node.js 18 + MongoDB 5.0.4环境下无法得到预期输出。
示例数据
{ "prefix": [ { "_id": "648c39f13af539b8dfebdf9d", "categoryId": [ "648468306806396cd3ab9710", "648850199e779dfd371a2766" ], "name": "Test Name" } ], "categories": [ { "_id": "648468306806396cd3ab9710", "name": "Cat A" }, { "_id": "648850199e779dfd371a2766", "name": "Cat B" } ] }
原聚合查询语句
db.prefix.aggregate([ { "$set": { "cat_ids": { "$map": { "input": "$categoryId", "as": "item", "in": { "$toObjectId": "$$item" } } } } }, { "$lookup": { "from": "categories", "localField": "categoryId", "foreignField": "_id", "pipeline": [ { $project: { _id: 1, name: 1 } } ], "as": "categoryDetail" } } ])
预期输出
[ { "_id": "648c39f13af539b8dfebdf9d", "cat_ids": [ ObjectId("648468306806396cd3ab9710"), ObjectId("648850199e779dfd371a2766") ], "categoryDetail": [ { "_id": "648468306806396cd3ab9710", "name": "Cat A" }, { "_id": "648850199e779dfd371a2766", "name": "Cat B" } ], "categoryId": [ "648468306806396cd3ab9710", "648850199e779dfd371a2766" ], "name": "Test Name" } ]
问题原因
原查询中虽然通过$map和$toObjectId将字符串ID数组转换为ObjectId数组存入cat_ids,但$lookup阶段仍然使用原字符串数组字段categoryId作为localField,而categories集合的_id是ObjectId类型,字符串与ObjectId类型不匹配,导致关联失败,无法获取到categoryDetail数据。
修改后的聚合查询
将$lookup的localField改为转换后的cat_ids字段即可解决类型不匹配问题:
db.prefix.aggregate([ { "$set": { "cat_ids": { "$map": { "input": "$categoryId", "as": "item", "in": { "$toObjectId": "$$item" } } } } }, { "$lookup": { "from": "categories", "localField": "cat_ids", // 改为转换后的ObjectId数组字段 "foreignField": "_id", "pipeline": [ { $project: { _id: 1, name: 1 } } ], "as": "categoryDetail" } } ])
补充优化
如果不需要保留cat_ids字段,可以在查询末尾添加$unset阶段移除:
{ "$unset": "cat_ids" }
内容的提问来源于stack exchange,提问作者Shreyas H
相关产品推荐
相关产品推荐

