javascript - 如何在nodejs中过滤多级类别
问题描述
我正在尝试为多个项目创建一个过滤器,即名称、卖家、价格、类别 slug、品牌。我创建了一条路线,您可以在下面找到它,并为每个过滤器提供查询参数,除类别外,所有过滤器都在工作。这是一个多层次的类别。
我可能做错了什么?
这是我的路线
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
}
解决方案
您的 categoryFilter 必须具有以下结构:
const categoryArr = (category) => category.find((x) => [slug].includes(x.slug))
const categoryFilter = {}; //Just an Object
if(dataFilter.length > 0){
categoryFilter = {
category: { "$in": categoryArr }
}
}
否则可以通过名称或蛞蝓找到
if(dataFilter.length > 0){
const mappedCategory = categoryArr.map( cat =>
({ "$or": [name: cat.name, slug: cat.slug] })
);
categoryFilter.category = { "$in": {...mappedCategory}}
}
我无法测试这段代码的时间,但至少它可以指导你它会是怎样的。
您需要在数组中找到一个对象。然后你必须使用$in
它来找到它。然后您可以设置是否要搜索对象或对象中的参数。
推荐阅读
- javascript - 如果“wall_amount”中的用户输入超过 3,如何自动选择复选框
- go - 是否可以使用 twilio-go 客户端库指定出站代理?
- graphql - 客户端的graphql查询成本分析
- extjs - 云服务(扩展 .. 从 VS 部署 - 似乎永远不会完成
- redis - Azure Redis 缓存超时
- asp.net-core - 在 ASP.Net Core 5.0 中,如何将旧的 .aspx webform 路由到 IIS 中托管的控制器操作
- google-apps-script - 如何在列中循环,当某个值被命中时,会根据同一行中的值发送一封电子邮件,并针对设定的范围执行此操作?
- reactjs - 如何使用 Swiper.js 和 React 自定义动态分页子弹样式的过渡动画
- python - 你如何使用 python 找到 Discord.exe?
- gstreamer - 如果 rtph265pay 在 rtph265depay 之前启动,则 GStreamer rtph265pay/rtph265depay 不起作用