猫鼬-如何在填充和过滤后使用“ where”子句

时间:2020-08-18 15:12:46

标签: mongodb mongoose mongodb-query nosql aggregation-framework

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

CategoryId位于每个产品对象内部(在类别中指的是_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)!而必须先进行过滤。

1 个答案:

答案 0 :(得分:0)

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

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

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