我需要使用一组通过标头传递的参数来执行查询。其中一个params是字符串数组。查询如下:
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
,那么大小将是未定义的。此外,我不能将大小包含在params中,因为它们使用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 }));
});