我也在经营一个电子商务网站。这是我关于如何实现您提到的功能的建议。希望能帮助到你。
我以扁平结构组织它们,在你的情况下它是:
{_id: 1, name: "Electronics", parentId: 0, idPath: "/0/1/" ...}
{_id: 2, name: "Computers", parentId: 1, idPath: "/0/1/2/", ...}
{_id: 3, name: "Graphic Cards", parentId: 2, idPath: "/0/1/2/3/", ...}
现在该产品只需位于叶子类别中。在你的情况下:
{
_id: asdasfwetrw34tw34t245y45y,
name: "NVIDIA GTX670",
price: 99.50,
...
...
categoryIds: [3]
}
当然,产品可以属于多个类别,因此categoryIds
仍然是一个数组。
这是棘手的部分。当您列出Electronics
类别,您可以通过以下方式找到其所有子类别:
db.categories.find({idPath: /^\/0\/1/})
idPath
索引在这里工作,所以它会很快。当你找到所有的子类目后,你就可以很容易地找到其中的所有产品(在子类目上建立索引)categoryIds
of Product
收藏)。
或者,您可以将所有类别读入内存,并使用 key->categoryId、value->[所有子类别] 构建一个哈希表。您的类别通常不会经常更改,并且您不会有很多类别。这样就会好起来的。
首先我认为你的类别有问题。Women fashion
是通用的东西,你应该把你的产品变成更具体的东西,而且选项也应该在那里。例如,可能有一个类别coat
其中有size
& color
, 以外women fashion
。虽然可能仍然存在color
选项中women fashion
因为这是所有子类别的共同特征。
如果您想一想,为什么所有子类别都组织在一个父类别中?因为他们有一些共同点。该公共部分应该是父类别的公共选项。也就是说,所有的父类和子类之间应该有继承关系。例如:
女性时尚:色彩
|-外套:尺寸
|-太阳镜:形状
Then coat
最终有2个选择color
& size
. sun glasses
: color
& shape
。当您观看时women fashion
,只有1个选择color
。它也过滤子类别,因为它们继承自women fashion
.
至于颜色的值,我的想法是只使用标准颜色Strawberry Red
实际上是red
, Tangerine
实际上是orange
。您确实不希望它们在过滤产品时出现。否则选项太多,肯定不利于用户体验。
然而,除此之外color
从类别中选择,我的网站也有一个叫做customizable options
。这些选项仅在产品上定义。当您查看类别时,它们永远不会出现。在这里你可以拥有Strawberry Red
& Tangerine
。在我看来,这些都不是产品的“天然”特性。它们仅用于让用户在查看产品时感觉更舒适。因此你也可以有这样的选择Tangerine with figure
etc.
关于选项的另一件事。您可能想要标记哪些选项应该用于过滤产品。例如color
绝对是其中之一。尽管dimension
也许不会。
关于选项的类型。如果对你来说足够的话,你的就很好。我还有很多类型,比如Number
, String
, Single Choice
, Multiple Choices
。我还计划实施Unit
。棘手的部分Unit
例如
1GB = 1024MB = 1024*1024B
所以当你拿到1GB和1TB的硬盘时,在筛选产品之前你可能需要做一下换算。这不是主题,我会回到你的问题。
请注意,虽然不同类别的选项具有相同的名称。它们不太可能是同一件事。Material
of Coat
and Furniture
是两个不同的东西。所以我倾向于为不同的类别定义不同的选项。因此也许有color
for toys
, and color
for women fashion
。这与上面提到的继承并不冲突,因为从某种程度上,子类别开始共享相同的选项。这与你如何组织类别结构完全相关。而如果你想改变品类结构或者转移产品一段时间,那就会很痛苦。因此,定义类别时要小心。
这就是我脑海中浮现的一切。恐怕我的母语不是英语,因此您可能会发现我的回答的某些部分难以理解。请随时告诉我。