我有一个数组的过滤器选项与多个操作符。在这里我提供了样本数据和结构。用户可以选择一个以上的过滤器与任何组合。样本JSON结构我已经给出了下面。什么是有效的方法来获得数据使用mongoose查询?
系列=〉'包含'、'不包含'、'开头为'、'结尾为'
产品数量=〉'='、'!='、'〉'、'〉='、'〈'、'〈='
状态=〉'活动','非活动'
属性数=〉'总数','强制','可选'
“自定义”、“本周”、“上周”、“前2周”、“本月”、“上月”、“前2月”
输入:
{
"search":"",
"offset":0,
"limit": 10,
"filter":[{
"filter_by":"family",
"operator":"starts_with",
"from_value":"test",
"to_value":""
},
{
"filter_by":"no_of_products",
"operator":"=",
"from_value":"10",
"to_value":""
}]
}
实际值:(schema.js)
return Joi.object({
search: Joi.string().allow('').description('Search the family by name'),
offset: Joi.number().required().description('Specify the offset for the pagination'),
limit: Joi.number().required().description('Limit the number of records to be displayed in the result'),
filter: Joi.array().items(Joi.object({
filter_by: Joi.string().valid('family','no_of_products', 'state', 'no_of_attributes', 'last_updated').allow('').description('Filter the results from the specified filter value.'),
operator: Joi.string().valid('contains', 'doesnt_contain', 'starts_with', 'ends_with','is_empty', 'is_not_empty', 'active', 'inactive', '=', '!=', '>','>=', '<', '<=', 'total', 'mandatory', 'optional', 'custom','this_week', 'last_week', 'last_2_week', 'this_month', 'last_month', 'last_2_month').allow('').description('Provide operator name'),
from_value: Joi.string().allow('').description('from_value'),
to_value: Joi.string().allow('').description('to_value')
}))
}).label('family')
controller.js:
if(!search && !filter){
dbFamilies = await Family.find({client_id : client_id, "status": { $ne: 'Deleted' }})
.populate([{path:'created_by'},{path:'updated_by'}])
.sort("name ASC").limit(limit).skip(offset).lean()
}else if(!!search){
// dbFamilies = await Family.find({client_id : client_id, name: search, "status": { $ne: 'Deleted' }})
// .collation({ locale: 'en', strength: 2 }).sort("name ASC").limit(limit).skip(offset).lean()
dbFamilies = await Family.find(
{ $and: [{client_id : client_id, "name": { "$regex": search, "$options": "i" }, "status": { $ne: 'Deleted' }}]})
.populate([{path:'created_by'},{path:'updated_by'}])
.sort("name ASC").limit(limit).skip(offset).lean()
}else if(!!filter){
}
1条答案
按热度按时间bnlyeluc1#
在这里我添加了我的解决方案。在这个解决方案中,获取请求并在对象内创建查询,然后根据请求参数将整个对象传递给mongoose查询。希望它能对其他人有所帮助。