【问题标题】:Complex Mongoose Filter Query复杂的 Mongoose 过滤器查询
【发布时间】:2019-07-08 03:40:24
【问题描述】:

我正在构建一个允许用户使用侧边栏过滤结果的网站。他们选择的条件越多,他们的搜索结果就应该越具体(见附图)。

用户可以选择与他们正在寻找的内容相匹配的过滤器(复选框)。我正在为此使用 MongoDB。我的架构如下:

brandName: {
    type: String,
    required: false
  },
productType: {
    type: String,
    required: false
  },
  skincareConcern: {
    type: Array,
    required: false
  },
  ingredients: {
    type: Array,
    required: false
  },
  skinType: {
    type: Array,
    required: false
  }

现在,我正在使用 .find()$or 查询,但这不正确,因为 $or 返回任何这些条件的所有匹配项。我需要结果来过滤/缩小我包含的更多标准。

在下面查看我当前的代码:

Products.find({
    $or: [
      { brandName : { $in : brands, $exists: true, $ne: [] } },
      { skincareConcern : { $in : skincareConcerns, $exists: true, $ne: [] } },
      { productType : { $in : productTypes, $exists: true, $ne: [] } },
      { ingredients : { $in : ingredients, $exists: true, $ne: [] } },
      { skinTypes : { $in : skinTypes, $exists: true, $ne: [] } }
    ]
  }

样本负载:

{"brands":["ACWELL","BOTANIC FARM"],"skincareConcerns":[],"productTypes":["essence","moisturizer"],"ingredients":[],"skinType":[]}

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您可以创建一个查询变量来保留将用于过滤的字段。

    示例:

    var query = {};
    var payload = {"brands":["ACWELL","BOTANIC FARM"],"skincareConcerns":[],"productTypes":["essence","moisturizer"],"ingredients":[],"skinType":[]};
    if (payload.brands && payload.brands.length > 0) query.brandName = {$in : payload.brands};
    if (payload.skincareConcerns && payload.skincareConcerns.length > 0) query.skincareConcern = {$in : payload.skincareConcerns};
    if (payload.productTypes && payload.productTypes.length > 0) query.productType = {$in : payload.productTypes};
    if (payload.ingredients && payload.ingredients.length > 0) query.ingredients = {$in : payload.ingredients};
    if (payload.skinTypes && payload.skinTypes.length > 0) query.skinTypes = {$in : payload.skinTypes};
    var result = await Products.find(query);
    

    【讨论】:

    • 谢谢!这正是我想要的!
    【解决方案2】:
    let aggrQuery = [
        {
            '$match': {
                $and: [
                    brandName ? { 'brandName ': { $in: brands } } : {},
                    skincareConcern ? { 'skincareConcern ': { $in: skincareConcerns } } : {},
                    productType ? { 'productType ': { $in: productTypes } } : {},
                    ingredients ? { 'ingredients ': { $in: ingredients } } : {},
                    skinTypes ? { 'skinTypes ': { $in: skinTypes } } : {}
                ]
            }
        }
    ]
    Products.aggregate(aggrQuery).exec((err, result) => {
    
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-16
      • 2017-05-22
      • 2016-10-08
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      相关资源
      最近更新 更多