如何在mongoose中用params执行查询,如果数组未定义,其中一个是数组



我需要使用一组通过标头传递的参数来执行查询。其中一个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 }));
});