首页 > 解决方案 > 来自多个集合的 $lookup 的 Mongoose 聚合返回空集

问题描述

我有 3 个收藏:

  1. 用户
  2. 公司
  3. 商店

用户和商店对公司有对象引用。

用户: company: { type: Schema.Types.ObjectId, ref: 'Company'}

商店: parentCompany: { type: Schema.Types.ObjectId, ref: 'Company'}

我正在尝试对公司进行简单聚合,并希望拥有给定公司的所有用户和商店。

companyModel.aggregate(
        [
            { $match: { _id: 'companyidhere123445' } },
            {
                $lookup: {
                    from: 'stores',
                    localField: '_id',
                    foreignField: 'parentCompany',
                    as: 'stores',
                }
            },
            { $unwind: '$stores' },
            {
                $lookup: {
                    from: 'users',
                    localField: '_id',
                    foreignField: 'company',
                    as: 'users',
                }
            },
            { $unwind: '$users' },
        ]);

我得到一个空数组。(是的,我测试了 id 匹配,model.find 为相同的 id 返回公司,是的,用户和商店分别匹配 idcompanyparentCompany字段。我已经检查了可能的重复项,但我不知道我在做什么不同,但我的聚合返回为空。在 mongoose 和 mongo shell 中测试了相同的查询。没有错误,没有警告。)

标签: node.jsmongodbmongoose

解决方案


解决了!(我猜是那些日子之一!)

id 在 req.params 中,尽管这对于 findOne 或 findById 之类的查询很有效,但它不适用于聚合,因此在匹配中使用之前,我必须将其重新转换为 mongoose 对象 id:

const matchId = mongoose.Types.ObjectId(req.params.id);

然后:

{ $match: { _id: matchId } },

瞧!(我从哪里可以得到那种用头撞键盘的动图?)


推荐阅读