首页 > 解决方案 > 如何使用参数在猫鼬中执行查询,如果数组未定义,其中之一是数组?

问题描述

我需要使用一组通过标头传递的参数来执行查询。其中一个参数是字符串数组。查询如下所示:

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);

问候。

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


您需要像这样简化您的请求,

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 }));
});

推荐阅读