如何为文件系统创建分层架构
var Folder = new Schema({
'name' : String,
'isFile' : Number,
'children' : [Folder]
});我们可以这样做吗?
发布于 2013-05-13 17:11:11
您使用的模式将子文件夹嵌入到父文件夹中。这可能会起作用,但它有几个问题。
第一个是每个文件夹文档的大小可能会变得非常大,这取决于文件系统的大小,并且您可能会遇到达到大小限制的问题。
另一个问题是,它使得直接查找不在顶级的文档变得非常困难。
更好的解决方案是将父/子关系存储为引用。
var Folder = new Schema({
name: String,
isFile: Boolean,
parent: {
type: Schema.Types.ObjectId,
ref: 'Folder'
},
children: [{
type: Schema.Types.ObjectId,
ref: 'Folder'
}]
});ref属性只是指示mongoose应该在哪个Collection/Model mongoose中查找被引用的文档,因此如果您查询它,它可以找到它。在本例中,我们引用了一个父类和一个子类列表,前者是一个文件夹,后者也是文件夹类型的文档。
存储对父对象的引用使您可以轻松地遍历树,对子对象的引用允许您自上而下地生成树。
您可以使用Mongoose的populate功能从参考资料中提取详细信息。有关填充和引用的更多信息,请参见the Mongoose documentation。
注意:我将isFile更改为Boolean字段,因为我假设您正在尝试存储是/否的值?
发布于 2015-01-30 01:27:06
有一些记录在案的方法可用于在MongoDB集合上存储分层数据,下面我将引用这些方法:
嵌套子路径引用数组References
你的选择将取决于你打算如何查询数据,每种方法都有自己的优缺点。如果需要,您可以通过这些方法中的多个一次简单地存储分层数据,但重要的是保持它们的更新。为此,我推荐一个mongoose插件。
我最喜欢的选择是物化路径,因为它在使用路径方面提供了更大的灵活性,比如通过部分路径查找节点。
我引用了一个来自MongoDB docs的例子
以下示例使用实体化路径对树进行建模,并将路径存储在字段路径中;路径字符串使用逗号作为分隔符:
{ _id: "Books", path: null }
{ _id: "Programming", path: ",Books," }
{ _id: "Databases", path: ",Books,Programming," }
{ _id: "Languages", path: ",Books,Programming," }
{ _id: "MongoDB", path: ",Books,Programming,Databases," }
{ _id: "dbm", path: ",Books,Programming,Databases," }Model.find().sort( { path: 1 } )您可以在路径字段中使用正则表达式来查找Programming:的子体
Model.find( { path: /,Programming,/ } )Model.find( { path: /^,Books,/ } )Model.find( { path: /,Books,$/ } )阅读上面文档链接中关于索引"path“字段以获得更好性能的更多信息。
这些方法中的任何一种都可以自己实现,也可以通过mongoose插件实现,您可以在http://plugins.mongoosejs.com上搜索“树”找到该插件。
发布于 2014-06-13 16:46:43
您已经使用了mongoose-tree或mongoose-materialized
https://stackoverflow.com/questions/16514912
复制相似问题