【问题标题】:How do I filter multi level categories in nodejs如何在nodejs中过滤多级类别
【发布时间】:2021-10-02 00:21:35
【问题描述】:

我正在尝试为多个项目创建一个过滤器,即名称、卖家、价格、类别标签、品牌。我创建了一条路线,您可以在下面找到它,并为每个过滤器提供查询参数,除类别外,所有过滤器都在工作。这是一个多层次的类别。

我做错了什么?

这是我的路线

   const pageSize = 10;
   const page = Number(req.query.pageNumber) || 1;
   const name = req.query.name || "";
   const slug = req.query.category || "";
   const seller = req.query.seller || "";
   const brand = req.query.brand || "";
   const order = req.query.order || "";
   const min =
      req.query.min && Number(req.query.min) !== 0 ? Number(req.query.min) : 0;
   const max =
      req.query.max && Number(req.query.max) !== 0 ? Number(req.query.max) : 0;
   const rating =
      req.query.rating && Number(req.query.rating) !== 0
        ? Number(req.query.rating)
        : 0;

   const nameFilter = name ? { name: { $regex: name, $options: "i" } } : {};
   const brandFilter = brand ? { brand: { $regex: brand, $options: "i" } } : {};
   const sellerFilter = seller ? { seller } : {};
   const categoryFilter = slug
    ? (category) => category.find((x) => [slug].includes(x.slug))
    : {};
   const priceFilter = min && max ? { price: { $gte: min, $lte: max } } : {};
   const ratingFilter = rating ? { rating: { $gte: rating } } : {};

   const count = await Product.count({
      ...sellerFilter,
      ...nameFilter,
      ...categoryFilter,
      ...priceFilter,
      ...ratingFilter,
      ...brandFilter
    });
    const products = await Product.find({
      ...sellerFilter,
      ...nameFilter,
      ...categoryFilter,
      ...priceFilter,
      ...ratingFilter,
      ...brandFilter
    })
    .populate("seller", "seller.name seller.logo")
    .populate({path: "category", select: "name slug"})
    .sort(sortOrder)
    .skip(pageSize * (page - 1))
    .limit(pageSize);
     res.send({ products, page, pages: Math.ceil(count / pageSize), count });
})) 

鉴于以下数据;

    "products": [
        {
            "category": [
                {
                    "name": "Category Two",
                    "slug": "category-two"
                }
            ],
            "name": "The First Fancy product",
            "seller": {
                "seller": {
                    "name": "John Doe"
                }
            },
            "price": 50000,
            "brand": "newtwo",
            "countInStock": 32,

            "description": "This is the long description which appears in the details screen",
        },
        {
            "category": [
                {
                    "name": "Category One",
                    "slug": "category-one"
                }
            ],
            "name": "Fancy new the second product",
            "seller": {
                "seller": {
                    "name": "Jane Doe"
                }
            },
            "price": 53000,
            "brand": "newone",
            "countInStock": 32,
            "description": "This is the long description which appears in the details screen",
        }
    ],
    "page": 1,
    "pages": 1,
    "count": 2
}

【问题讨论】:

    标签: javascript node.js arrays jagged-arrays


    【解决方案1】:

    您的 categoryFilter 必须具有下一个结构:

    const categoryArr = (category) => category.find((x) => [slug].includes(x.slug))
    const categoryFilter = {}; //Just an Object
    if(dataFilter.length > 0){
      categoryFilter = {
        category: { "$in": categoryArr }
      }
    }
    
    

    否则可以通过名称或slug找到

    if(dataFilter.length > 0){
      const mappedCategory = categoryArr.map( cat => 
        ({ "$or": [name: cat.name, slug: cat.slug] })
      );
    
      categoryFilter.category = { "$in": {...mappedCategory}}
    }
    

    我无法测试这段代码的时间,但至少它可以指导你它会是怎样的。

    你需要在一个数组中找到一个对象。然后你必须使用$in 来找到它。然后您可以设置是否要搜索对象或对象中的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 2012-06-19
      • 2020-08-28
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多