过滤 MongoDB 中的深层填充字段

问题描述 投票:0回答:1

如何通过深层嵌套填充字段过滤产品。 CatalogProduct 是一个 ObjectId(参考目录产品)。 category 是catalogProduct 中的一个ObjectId(参考类别)。类别是类别 id 的数组。

products = await StorageModel
                .find({"catalogProduct.category": {$in: categories }})
                .skip((page-1)*8)
                .limit(8)
                .populate({path: "catalogProduct", populate: {path: "category", select: "name"}})
                .select('-__v')
                .sort({_id: -1});

javascript database mongodb mongoose
1个回答
2
投票

您需要对 CatalogProduct 集合执行

$lookup
操作,以便可以在查询中访问 CatalogProduct 数据。

不幸的是,这仅在使用 Mongo Aggregation 时可用,但是聚合非常强大并且非常适合此类事情。你可以做这样的事情:

const products = await StorageModel.aggregate([
    { $lookup: {  // Replace the Catalog Product ID with the Catalog  Product
        from: "catalogProduct",
        localField: "catalogProduct",
        foreignField: "_id",
        as: "catalogProduct"
    } },
    { $lookup: {  // Replace the Category ID with the Category
        from: "categories",
        localField: "catalogProduct.category",
        foreignField: "_id",
        as: "catalogProduct.category"
    } },
    { $addFields: {  // Replace the Category with its name
        "catalogProduct.category": "$catalogProduct.category.name"   
    } },
    { $match: {
        "catalogProduct.category": { $in: categories }
    } },
    { $sort: { _id: -1 } },
    { $skip: (page - 1) * 8 },
    { $limit: 8 }
]);

理想情况下,在对结果进行分页(使用

$lookup
$skip
)之前,您不会执行
$limit
,但在这种情况下,首先执行
$lookup
是有意义的。确保您在
catalogProduct._id
categories._id
上有索引以优化查询。

有关

$lookup
的更多信息,请参阅 this 文章。有关 Mongo 聚合的更多信息,请参阅this文章。

© www.soinside.com 2019 - 2024. All rights reserved.