如何通过深层嵌套填充字段过滤产品。 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});
您需要对 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文章。