我正在管理一个建筑产品商店的MongoDB数据库。最直接的收集是产品,对吗?有相当多的产品,但它们都属于一组5-8类中的一个,然后在一个小的子类别中属于一个子类。
例如:
-Electrical
*Wires
p1
p2
..
*Tools
p5
pn
..
*Sockets
p11
p23
..
-Plumber
*Pipes
..
*Tools
..
PVC
..我将使用在网站客户端的角度显示整个产品目录,我会考虑使用AJAX查询我想要的产品的正确子集。
然后,我想知道我是否应该管理一个只有这样的收藏:
{
MainCategory1: {
SubCategory1: {
{},{},{},{},{},{},{}
}
SubCategory2: {
{},{},{},{},{},{},{}
}
SubCategoryn: {
{},{},{},{},{},{},{}
}
},
MainCategory2: {
SubCategory1: {
{},{},{},{},{},{},{}
}
SubCategory2: {
{},{},{},{},{},{},{}
}
SubCategoryn: {
{},{},{},{},{},{},{}
}
},
MainCategoryn: {
SubCategory1: {
{},{},{},{},{},{},{}
}
SubCategory2: {
{},{},{},{},{},{},{}
}
SubCategoryn: {
{},{},{},{},{},{},{}
}
}
}或者每个类别都有一个集合。文件数量可能不超过500份。然而,我关心的是平衡:
我用的是mongodb node.js模块,现在不是猫鼬。
我要做什么CRUD操作?
发布于 2014-05-23 06:31:18
我同意客户端应该得到最容易渲染的结果。然而,将类别嵌套到产品中仍然是个坏主意。权衡是一旦你想要改变,例如,一个类别的名称,它将是一场灾难。如果您考虑到可能的使用情况,例如:
你会发现很难用你的数据结构来做这些事情。
我在目前的项目中也遇到过同样的情况。这就是我要做的,供你参考。
首先,类别应该在单独的集合中。不相互嵌套类别,因为查找所有子类别会使过程复杂化。查找所有子类别的传统方法是维护idPath属性。例如,将您的类别划分为三个级别:
{
_id: 100,
name: "level1 category"
parentId: 0, // means it's the top category
idPath: "0-100"
}
{
_id: 101,
name: "level2 category"
parentId: 100,
idPath: "0-100-101"
}
{
_id: 102,
name: "level3 category"
parentId: 101,
idPath: "0-100-101-102"
}注意,在idPath中,不再需要parentId。你可以更容易地理解这个结构。
一旦您需要查找类别100的所有子类别,只需执行以下查询:
db.collection("category").find({_id: /^0-100-/}, function(err, doc) {
// whatever you want to do
})将类别存储在单独的集合中,在您的产品中,您需要通过_id引用它们,就像使用关系数据库管理系统时一样。例如:
{
... // other fields of product
categories: [100, 101, 102, ...]
}现在,如果您想找到某个类别中的所有产品:
db.collection("category").find({_id: new RegExp("/^" + idPath + "-/"}, function(err, categories) {
var cateIds = _.pluck(categories, "_id"); // I'm using underscore to pluck category ids
db.collection("product").find({categories: { $in: cateIds }}, function(err, products) {
// products are here
}
})幸运的是,类别集合通常非常小,里面只有数百条记录(或数千条)。而且变化不大。因此,始终可以在内存中存储类别的活动副本,并且可以将其构造为嵌套对象,如下所示:
[{
id: 100,
name: "level 1 category",
... // other fields
subcategories: [{
id: 101,
... // other fields
subcategories: [...]
}, {
id: 103,
... // other fields
subcategories: [...]
},
...]
}, {
// another top1 category
}, ...]您可能需要每隔几个小时刷新一次此副本,因此:
setTimeout(3600000, function() {
// refresh your memory copy of categories.
});我现在只想到这些。希望能帮上忙。
编辑:
projection参数的文档。https://stackoverflow.com/questions/23821786
复制相似问题