【问题标题】:Filter query for fetching product based on categories in MERN application?根据 MERN 应用程序中的类别过滤查询以获取产品?
【发布时间】:2021-12-09 03:48:54
【问题描述】:

这是我的Product Schema

const product = mongoose.Schema({
    name: {
        type: String,
    },
    category:{
        type: ObjectId,
        ref: Category
    }
}

我想根据来自前端的过滤器退回产品。 例如:假设有 2 个类别 SummerWinter。当用户想要按Summer 类别过滤产品时,我会向http://localhost:8000/api/products?category=summer 进行api 调用

现在我的问题是,我如何过滤,因为我从前端获取类别名称并且产品架构中有 ObjectId。 我的尝试: Project.find({category:categoryName})

【问题讨论】:

标签: mongodb express mongoose


【解决方案1】:

如果我理解正确,您可以尝试以下查询之一:

第一个是使用管道进入$lookup 以匹配categoryname 在这样的一个阶段:

yourModel.aggregate([
  {
    "$lookup": {
      "from": "category",
      "let": {
        "category": "$category",
        
      },
      "pipeline": [
        {
          "$match": {
            "$expr": {
              "$and": [
                {
                  "$eq": [
                    "$id",
                    "$$category"
                  ]
                },
                {
                  "$eq": [
                    "$name",
                    "Summer"
                  ]
                }
              ]
            }
          }
        }
      ],
      "as": "categories"
    }
  },
  {
    "$match": {
      "categories": {
        "$ne": []
      }
    }
  }
])

例如here

其他方式是使用普通的$lookup,然后$filterjoin返回的数组。

yourModel.aggregate([
  {
    "$lookup": {
      "from": "category",
      "localField": "category",
      "foreignField": "id",
      "as": "categories"
    }
  },
  {
    "$match": {
      "categories": {
        "$ne": []
      }
    }
  },
  {
    "$set": {
      "categories": {
        "$filter": {
          "input": "$categories",
          "as": "c",
          "cond": {
            "$eq": [
              "$$c.name",
              "Summer"
            ]
          }
        }
      }
    }
  }
])

例如here

注意两个查询如何使用$match: { categories: { $ne : []}},这是因为如果查找没有找到任何结果,它会返回一个空数组。顺便说一句,这个阶段是可选的。

您还可以添加$unwind$arrayElemAt index 0 或其他任何内容以从数组中仅获取一个值。

此外,要在 mongoose 中执行此操作,您只需将 "Summer" 替换为您的变量。

【讨论】:

  • 我认为它似乎有效。再查询一个,如果用户选择了一个或多个类别,比如用户想过滤类别为夏季和雨天的产品怎么办?
  • 你的意思是this example
  • 是的。如果有很多记录,第二个示例将不会有效
  • 是的,最好一步完成,避免迭代每个文档中的每个值。所以第一个例子是一个不错的选择,但语法可能有点难以理解
  • 我在这个查询中有另一个问题。如果用户选择一个或多个类别,例如用户想要过滤类别为夏季或下雨的产品怎么办?那么这行不通吗?
猜你喜欢
  • 2022-11-17
  • 2020-03-19
  • 1970-01-01
  • 2015-12-19
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多