如何在nodejs中过滤多级类别

ohfgkhjo  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(456)

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

  1. const pageSize = 10;
  2. const page = Number(req.query.pageNumber) || 1;
  3. const name = req.query.name || "";
  4. const slug = req.query.category || "";
  5. const seller = req.query.seller || "";
  6. const brand = req.query.brand || "";
  7. const order = req.query.order || "";
  8. const min =
  9. req.query.min && Number(req.query.min) !== 0 ? Number(req.query.min) : 0;
  10. const max =
  11. req.query.max && Number(req.query.max) !== 0 ? Number(req.query.max) : 0;
  12. const rating =
  13. req.query.rating && Number(req.query.rating) !== 0
  14. ? Number(req.query.rating)
  15. : 0;
  16. const nameFilter = name ? { name: { $regex: name, $options: "i" } } : {};
  17. const brandFilter = brand ? { brand: { $regex: brand, $options: "i" } } : {};
  18. const sellerFilter = seller ? { seller } : {};
  19. const categoryFilter = slug
  20. ? (category) => category.find((x) => [slug].includes(x.slug))
  21. : {};
  22. const priceFilter = min && max ? { price: { $gte: min, $lte: max } } : {};
  23. const ratingFilter = rating ? { rating: { $gte: rating } } : {};
  24. const count = await Product.count({
  25. ...sellerFilter,
  26. ...nameFilter,
  27. ...categoryFilter,
  28. ...priceFilter,
  29. ...ratingFilter,
  30. ...brandFilter
  31. });
  32. const products = await Product.find({
  33. ...sellerFilter,
  34. ...nameFilter,
  35. ...categoryFilter,
  36. ...priceFilter,
  37. ...ratingFilter,
  38. ...brandFilter
  39. })
  40. .populate("seller", "seller.name seller.logo")
  41. .populate({path: "category", select: "name slug"})
  42. .sort(sortOrder)
  43. .skip(pageSize * (page - 1))
  44. .limit(pageSize);
  45. res.send({ products, page, pages: Math.ceil(count / pageSize), count });
  46. }))

给出以下数据:;

  1. "products": [
  2. {
  3. "category": [
  4. {
  5. "name": "Category Two",
  6. "slug": "category-two"
  7. }
  8. ],
  9. "name": "The First Fancy product",
  10. "seller": {
  11. "seller": {
  12. "name": "John Doe"
  13. }
  14. },
  15. "price": 50000,
  16. "brand": "newtwo",
  17. "countInStock": 32,
  18. "description": "This is the long description which appears in the details screen",
  19. },
  20. {
  21. "category": [
  22. {
  23. "name": "Category One",
  24. "slug": "category-one"
  25. }
  26. ],
  27. "name": "Fancy new the second product",
  28. "seller": {
  29. "seller": {
  30. "name": "Jane Doe"
  31. }
  32. },
  33. "price": 53000,
  34. "brand": "newone",
  35. "countInStock": 32,
  36. "description": "This is the long description which appears in the details screen",
  37. }
  38. ],
  39. "page": 1,
  40. "pages": 1,
  41. "count": 2
  42. }
7vux5j2d

7vux5j2d1#

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

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

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

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

我暂时无法测试这段代码,但至少它可以指导您如何使用它。
您需要在数组中找到一个对象。那么你必须使用 $in 找到它。然后可以设置是否要搜索对象或对象中的参数。

展开查看全部

相关问题