Мне нужно выполнить запрос с набором параметров, которые передаются через заголовки. Один из параметров представляет собой массив строк. Запрос выглядит так:
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 }));
});
Можете ли вы продемонстрировать, пожалуйста, как я могу удалить это поле из запроса, если «размеры» не были в req.headers? Спасибо