javascript - 如何使用参数在猫鼬中执行查询,如果数组未定义,其中之一是数组?
问题描述
我需要使用一组通过标头传递的参数来执行查询。其中一个参数是字符串数组。查询如下所示:
router.get('/', (req, res) => {
const { category, subCategory, product, size } = req.headers;
let sizes,
params = {};
if (category) params["category.text"] = category;
if (subCategory) params["subCategory.text"] = subCategory;
if (product) params["product.text"] = product;
if(size) sizes = _.split(size, ',');
Item.find({
...params,
size: { $in: sizes }
}).sort({ _id: 1 })
.then(items => res.json(items.reverse()))
.catch((err) => res.json({ message: err }));
});
使用 lodash 处理大小后,它看起来像字符串数组:
['XL','L']
问题是如果这个参数size
没有被传递,那么大小将是未定义的。此外,我不能将大小包含在参数中,因为它们使用 mongodb 语法(即$in
)进行检查。如何处理查询,使其检查数组是否包含值,如果它不在查询中则忽略它?我希望我解释清楚。
我还将给出一个简化的模型以使其更清晰:
const mongoose = require('mongoose');
const ItemModel = mongoose.Schema({
category: [{
lang: String,
text: String
}],
subCategory: [{
lang: String,
text: String
}],
product: [{
lang: String,
text: String
}],
size: [{
type: String,
required: true
}],
date: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('Items', ItemModel);
问候。
解决方案
您需要像这样简化您的请求,
router.get('/', (req, res) => {
let params = {};
if (req.headers.category) params["category.text"] = req.headers.category;
if (req.headers.subCategory) params["subCategory.text"] = req.headers.subCategory;
if (req.headers.product) params["product.text"] = req.headers.product;
if (req.headers.size) params['size'] = { $in: _.split(req.headers.size, ',') };
Item.find(params).sort({ _id: 1 })
.then(items => res.json(items.reverse()))
.catch((err) => res.json({ message: err }));
});
推荐阅读
- c# - .NET Core WebAPI VueJS 模板发布问题
- android - 片段中的recyclerView水平问题
- android - 如何将 Genymotion 连接到 Android Studio 版本 3.5.3?
- flutter-web - 如何使用 Codemagic CI 构建和发布 Flutter Web 项目?
- vue.js - VueJS 路由器:确定第一个页面加载以禁用/更改页面转换
- python - 挑战任务以使用函数 find() 和 set()
- class - 继承类扩展
- php - 为什么 Formidable Pro 中的 PHP/MySQL COUNT 不工作?
- node.js - 使用 Express 对 Twitter 帐户进行身份验证时传递类似状态的数据
- swift - 使用主队列中的 Dispatch 一次调用一个函数