如何通过 mongoose 中的查询 ref 对象获取数据

How to get data by query ref object in mongoose

我有一个问题,没能找到我要找的东西。 我也有这个 Ads 参考其他人的模式:

    link: {
        type: String,
        default: 'n/a',
    },
    page: {
        type: mongoose.Schema.ObjectId,
        ref: 'AdsPage',
        required: true,
    },
    slot: {
        type: mongoose.Schema.ObjectId,
        ref: 'AdsSlot',
        required: true,
    },

我想通过在 page 属性 上应用条件来获取数据,page 是一个包含 url 属性 的模式。 页面架构:

    {
    title: {
        type: String,
        required: [true, 'Please add page title'],
        unique: true,
        trim: true,
        maxlength: [50, 'Name cannot be more then 50 characters'],
    },
    url: {
        type: String,
        required: [true, 'Add page URL'],
    },
    createdAt: {
        type: Date,
        default: Date.now,
    },
},

我想获取与提供的页面 url 相匹配的所有广告。

我的查询如下:

if (req.params.pageUrl) {
    const ads = await Ads.find({
        'page.url': req.params.pageUrl,
    });

    return res.status(200).json({
        success: true,
        message: 'Successfully fetched ads for specific page',
        count: ads.length,
        data: ads,
    });
}
参数中的

页 url 很好,但不知何故这个过滤器不起作用,我没有错误,但结果为零。 我试过 $match 属性 但遇到了一些上层错误。

非常感谢任何有关查询嵌套 ref 对象的帮助。

您可以使用 aggregate$lookup 来完成。您可以在 aggregation.

中查看更多详细信息

输出的 ads_pages 就是你的 adspages。聚合数组中的第一个元素 $lookup 将帮助您找到所有匹配条件,其中 _id 在广告页面中等于 page 在广告中 urladspage 中等于您的req.params.pageUrl.

聚合数组中的第二个元素,$match 将帮助您删除包含空 ads_pages 的文档,这意味着它的条件与上述条件不匹配。您可以使用此 https://jsfiddle.net/cuxvd2pm 进行测试。

await AdsModel.aggregate([
    {
        $lookup: {
            // This name must be same as your collection name "in the mongodb"
            // In my case, I must use lowercase string, and add more extra "s" in the end
            // If you didn't modify extra configuration, I think you should also do it.
            from: "adspages",

            // you could use as: "page" to replace the original field
            as: "ads_pages",
            let: { "page_id": "$page"},
            pipeline: [{ 
                $match: {
                    $expr: {
                        $and: [
                            {$eq: ["$url", req.params.pageUrl]},
                            {$eq: ["$_id", "$$page_id"]}
                        ]
                    }
                }
            }]
        }
    },
    {
        $match: {
            // when you change your `as field` to page
            // you should also change `ads_pages.0` to `page.0`
            "ads_pages.0": {
                $exists: true
            }
        }
    }
])