微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 MongoDB/React 中过滤数据的最佳实践是什么?

如何解决在 MongoDB/React 中过滤数据的最佳实践是什么?

我今天带着一个理论问题来到这里。 (提示:这将是漫长而艰难的,但为了完全理解这个问题,我想我必须写下每一个重要的细节。如果你读到最后,非常感谢你,你不是我们应得的英雄,而是我们应得的英雄需要)

故事时间:我目前正在从 0 开始建立一个网上商店。它的原则与 ebay 相同:用户可以为他们使用的产品创建广告。问题是我想创建一个过滤功能

我的 MongoDB 数据结构是什么?

我的页面包含具有不同属性的产品,我的意思是这些产品具有不同的类别和价值。想象一下这是一个例子

Product A:
Creator:User1
Category:Car
Type:BMW
Color:Red

Product B:
Creator:UserB
Category:Electronics
Type:Phone
Producer:Apple

为了更复杂,每个用户可以为每个产品定义最多 3 个额外的类别和价值。因此,例如 User1 添加了 2 个新类别,最终产品将是:

Product A:
Creator:User1
Category:Car
Type:BMW
Color:Red
Number of seats:4
Fuel type: Gasoline

因为上面提到,当用户添加新产品时,会有两种类型的类别:由我预定义的静态类别(以汽车为例)和动态类别添加(座位数、燃料类型或其他任何内容)。

总体而言:我在 mongoDB 中的最终数据结构不是静态的,因为添加了一些类别。因此,我有一个 Product 集合,每个文档看起来都像上面提到的示例

项目如何显示

我有一个主页。当我填充它时,我使用 $skip 和 $limit 属性设置为 8 进行调用,因此我第一次只查询 8 个产品。如果用户点击加载更多按钮,它将加载另外 8 个产品,依此类推。

最后:我的实际问题......

所以在这一点上,我猜您已经了解与业务逻辑相关的所有内容,所以是时候问我的问题了:如果我想过滤这些动态产品,但我不知道什么是最佳做法?

我的想法: 首先创建一个名为 Categories 的 mongoDB 集合。每个主要类别将是其中的一个文档,我们将存储静态和动态类别和值 例如:

category:car
predefined:[{type:[BMW,Mustang,Ferrari]},{color:[red,green,blue]}]
userdefiend:[{number of seats:[2,4,5,6]},{fuel type:[Gasoline,Air,Diesel]}]

如果用户单击特定值(例如:BMW),我们将加载主页面中的值,我们将限制设置为 8,然后查看我们的产品集合并获取类型为:BMW 的 8 个项目。如果他选择另一个选项,例如:color:Red,我们将再次遍历集合,但现在有两个条件:Type:BMW 和 color:Red。

Idea2:使用此结构再次创建一个类别集合

categoryType:predefined
mainCategory:Car
categoryName:Type
BMW:[prodA,prodC,prodD]
Ferrari:[prodD,prodE]
...values:products which contains

categoryType:userdefined
mainCategory:Car
categoryName:Number of seats
4:[prodA,prodD],5:[prodE]

如果用户从 Type 类别中选择 BMW,我们会从 BMW 字段 [prodA,prodD] 加载产品。如果用户选择值为 4 的座位类别数,我们将加载 [prodA,prodD],并在网页上对我们的实际产品使用过滤器,因此它仅保留为 [prodA,prodD]。从我们的实际列表中,我们对特定产品使用 findById。

我认为从任何角度来看这些都不是最好的选择,但我真的很困惑。

你们认为我应该如何构建我的类别/产品以获得有效的读/写/更新复杂性?

无论如何,感谢您阅读本文,如果您能坚持到这里,我对您的想法很好奇。祝你有美好的一天

更新:

过滤功能

为了避免混淆,这是我的过滤想法:当用户选择主要类别(例如汽车或电子产品)时,我只想显示相关的过滤类别和选项。汽车案例中的过滤类别是类型和颜色。 我希望这些过滤选项具有预先填充的选项。我的意思是,如果过滤类别是类型,并且有 2 个产品具有类型:宝马和类型:法拉利,我想将这些值显示为过滤选项。而且我不想对这些选项进行硬编码,例如我对 Type:Laborghini 进行了硬编码,并且我没有 Laborghini 类型的产品。

最后,如果用户点击 Type:BMW,我将根据该条件过滤我的所有产品。

我的过滤侧边菜单如下所示:

Type: BMW,Ferrari (these values exists in my database)
Color:Red,Black,Grey,Yellow

对于用户添加的类别,我将构建一个搜索栏,如果用户选择了一个用户定义的类别,我想添加过滤类别中,以便整体外观如下所示:

Type: BMW,Yellow
Number of seats:4,6,7 (number of seats category is added by user,7 are the existing values to this category)

解决方法

您可以像拥有一个通用的 Products 集合一样构建您的数据。两者都有

Product A:
Creator:User1
Category:Car
Type:BMW
Color:Red

Product B:
Creator:UserB
Category:Electronics
Type:Phone
Producer:Apple

行。每当您显示过滤器组件时,您都可以使用聚合 (https://stackoverflow.com/a/43570730/1859959)

选择可用类别

这会生成“创作者”、“类别”、“类型”、“颜色”、“制作人”等搜索框。

数据本身将尽可能通用。

当用户想要添加新产品时,它会从模板开始,例如“汽车”或“电子产品”。 Templates 集合为他提供了初始值,应该包括在内。所以它会像:

{Car: [{type:[BMW,Mustang,Ferrari]},{color:[red,green,blue]}],Electronics: ... }

选择汽车会生成“类型”和“颜色”输入框。保存表单会将新行插入到 Products 中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。