Mongoose中跨deposits与coin_infos集合关联查询返回空数组问题
解决MongoDB聚合$lookup返回空数组的问题
嘿,我帮你分析下这个$lookup返回空数组的问题,大概率是这几个原因之一:
类型不匹配(最常见的情况):你看返回的deposits文档里,
coin_key是字符串类型的"5a4b07b2a0050c20a6be44b3",但coin_infos集合的_id是MongoDB默认的ObjectId类型——这俩类型不一样,$lookup根本匹配不上,自然返回空的user数组。解决方法很简单,在聚合里先把
coin_key转成ObjectId再做关联:db.deposits.aggregate([ { $addFields: { // 把字符串类型的coin_key转成ObjectId coin_key_obj: { $toObjectId: "$coin_key" } } }, { $lookup: { from: 'coin_infos', localField: 'coin_key_obj', // 用转换后的字段关联 foreignField: '_id', as: 'user' } }, // 可选操作:如果不需要临时的coin_key_obj字段,可以删掉它 { $project: { coin_key_obj: 0 } } ]).pretty();coin_infos里根本没有对应的数据:先手动验证下coin_infos集合里是否存在
_id为ObjectId("5a4b07b2a0050c20a6be44b3")的文档,执行这条查询:db.coin_infos.find({ _id: ObjectId("5a4b07b2a0050c20a6be44b3") }).pretty();如果这个查询返回空,那就是源数据本身没有对应记录,关联自然出不来结果。
集合名称拼写错误:MongoDB在$lookup里如果指定的集合不存在,不会抛出错误,只会返回空数组。再检查一遍
from: 'coin_infos'这个集合名和你数据库里实际的集合名完全一致,有没有少打/多打字母、大小写错误之类的问题。
内容的提问来源于stack exchange,提问作者Sarus Crane
相关产品推荐
相关产品推荐

