Vip*_*per 3 mongoose mongodb node.js
我正在构建一个允许用户使用侧边栏过滤结果的站点。他们选择的条件越多,他们的搜索结果就越具体(见附图)。
用户可以选择与他们要查找的内容相匹配的过滤器(复选框)。为此,我正在使用 MongoDB。我的架构如下:
brandName: {
type: String,
required: false
},
productType: {
type: String,
required: false
},
skincareConcern: {
type: Array,
required: false
},
ingredients: {
type: Array,
required: false
},
skinType: {
type: Array,
required: false
}
Run Code Online (Sandbox Code Playgroud)
现在,我正在使用.find()
带有$or
查询的 a 但这不正确,即因为$or
返回任何这些条件的所有匹配项。我需要结果来过滤/缩小我包含的更多标准。
在下面查看我当前的代码:
Products.find({
$or: [
{ brandName : { $in : brands, $exists: true, $ne: [] } },
{ skincareConcern : { $in : skincareConcerns, $exists: true, $ne: [] } },
{ productType : { $in : productTypes, $exists: true, $ne: [] } },
{ ingredients : { $in : ingredients, $exists: true, $ne: [] } },
{ skinTypes : { $in : skinTypes, $exists: true, $ne: [] } }
]
}
Run Code Online (Sandbox Code Playgroud)
示例有效载荷:
{"brands":["ACWELL","BOTANIC FARM"],"skincareConcerns":[],"productTypes":["essence","moisturizer"],"ingredients":[],"skinType":[]}
Run Code Online (Sandbox Code Playgroud)
您可以创建一个查询变量来保留将用于过滤的字段。
样本:
var query = {};
var payload = {"brands":["ACWELL","BOTANIC FARM"],"skincareConcerns":[],"productTypes":["essence","moisturizer"],"ingredients":[],"skinType":[]};
if (payload.brands && payload.brands.length > 0) query.brandName = {$in : payload.brands};
if (payload.skincareConcerns && payload.skincareConcerns.length > 0) query.skincareConcern = {$in : payload.skincareConcerns};
if (payload.productTypes && payload.productTypes.length > 0) query.productType = {$in : payload.productTypes};
if (payload.ingredients && payload.ingredients.length > 0) query.ingredients = {$in : payload.ingredients};
if (payload.skinTypes && payload.skinTypes.length > 0) query.skinTypes = {$in : payload.skinTypes};
var result = await Products.find(query);
Run Code Online (Sandbox Code Playgroud)
小智 6
let aggrQuery = [
{
'$match': {
$and: [
brandName ? { 'brandName ': { $in: brands } } : {},
skincareConcern ? { 'skincareConcern ': { $in: skincareConcerns } } : {},
productType ? { 'productType ': { $in: productTypes } } : {},
ingredients ? { 'ingredients ': { $in: ingredients } } : {},
skinTypes ? { 'skinTypes ': { $in: skinTypes } } : {}
]
}
}
]
Products.aggregate(aggrQuery).exec((err, result) => {
})
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3300 次 |
最近记录: |