【问题标题】:How to create "products filter" efficiently in Node.js and Angular?如何在 Node.js 和 Angular 中高效地创建“产品过滤器”?
【发布时间】:2020-08-24 10:45:11
【问题描述】:

我正在创建一个带有 node/express 支持的 Angular 应用程序(计算机在线商店)。我有一个产品页面来显示我的数据库中的所有产品。一个产品有这个模型(打字稿):

interface Product {
  name: string
  properties: {name: string, value: string | number}[]
}

我在页面中有一个部分,您可以在其中按属性过滤产品。例如,用户可以过滤所有具有 4 核或 8 核的 CPU。现在这是这样实现的:

在 Angular 应用程序中,我查询所请求类别的 所有产品, 遍历所有这些,收集它们的属性和所有可能的值并像这样过滤......

const products = [
{
  name: 'intel cpu 1',
  properties: [
    {name: 'cores', value: 8},
    {name: 'clock speed', value: 2.6}
  ]
},
{
  name: 'intel cpu 2',
  properties: [
    {name: 'cores', value: 4},
    {name: 'clock speed', value: 1.2}
  ]
}
]

collectPropertiesFromProducts(products)

// RESULT: 
[
  {property: 'cores', possibleValues: [4,8]},
  {property: 'clock speed', possibleValues: [1.2,2.6]}
]

现在它工作得很好,我可以通过结果轻松过滤产品,而且它都是动态的(我只需向产品添加一个属性就可以了)。

问题在于它的扩展性非常糟糕,因为:

  • 我必须查询所有产品才能知道它们的属性
  • 更多产品/属性 = 更多 CPU 时间 = 阻塞主线程

我的问题是我怎样才能做得更好?我有一个节点服务器,所以将所有逻辑移到那里它非常没用,我也可以将“属性收集”功能移动到工作线程,但同样,我必须查询所有产品......

【问题讨论】:

  • 为什么将所有逻辑移到后端“毫无用处”?我认为这是唯一有效的解决方案。根据您的数据库的结构,您可能会发现在各种可过滤属性上对其进行索引很有用。

标签: javascript node.js angular mongodb


【解决方案1】:

您可以让 mongodb 为您进行计算,而不是在客户端或服务本身中处理这个问题。例如。您可以编写以下聚合:

db.getCollection('products').aggregate([{
            $unwind: "$properties"
        },
        {
            $project: {
                name: "$properties.name",
                total: {
                    $add: ["$properties.value", ]
                }
            }
        }, {
            $group: {
                _id: "$name",
                possibleValues: {
                    $addToSet: "$total"
                }
            }
        }

    ])

然后,您可以通过节点服务器上的自定义端点(例如 GET /product-properties)公开此查询,并在客户端使用响应。

【讨论】:

    【解决方案2】:

    您应该考虑向后端发出多个请求:

    第一: getQueryParams,一个返回你的结果的新端点

    第二: 接收初始产品集的无过滤请求

    第三: 选择过滤器时(基于第一个请求),您使用所选过滤器执行新请求

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 2021-01-15
      • 2016-10-09
      相关资源
      最近更新 更多