首页 > 解决方案 > Mongoose-如何在填充和过滤后使用“where”子句

问题描述

我有两个模型 - 产品和类别

CategoryId 在每个产品对象内(指的是 Category 中的 _id)。

类别看起来像这样:

{
    "_id": ObjectId("5f3564489dc78d423f75af3d"),
    "category": "OVEN",
    "__v": 0
}

产品看起来像这样

{
    "_id": ObjectId("5f36dd21ee0c6c27c04903cc"),
    "categoryId": ObjectId("5f358007159810587d26ee5e"),
    "__v": 0
}

我想要产品并且我想在得到它们之前按顺序做这些事情:

1.填充categoryId。

2. 只过滤掉需要的categoryId。

3.执行限制,跳过。

我怎样才能做到这一点?

这就是我目前的做法

Product.find({})
        .populate({
          path: "categoryId",
          options: {
          limit: limitProductsOnPage,
          sort: { rank: 1 },
          skip: (page - 1) * limitProductsOnPage
         },
      })
       .exec(function(err, products) {
            if (err) {
                console.log("Error Occured", err);
             }

     let filteredProducts;//to Store Filtered Products
                                

     filteredProducts = products.filter(product=> { (#POINT-1)
                                        
          if(product.categoryId._id.toString() == category_id){
                       return product;
          }
      });
 }

这里的主要问题是我在限制后过滤(#POINT-1)并跳过!而过滤必须先完成。

标签: mongodbmongoosemongodb-querynosqlaggregation-framework

解决方案


我认为您可以在一个查询中完成所有这些操作,通过使用过滤掉特定的类别 ID $ne。做类似的事情:

Product.find({categoryId: {$ne: category_id})
    .sort({ rank: 1 })
    .limit(limitProductsOnPage)
    .skip((page - 1)* limitProductsOnPage)
    .populate("categoryId")

这应该具有您想要的所需行为,尽管它不会按照您想要的确切顺序进行。


推荐阅读