我们如何创建一个分层架构的文件系统猫鼬模式像一个文件夹>子文件夹层次数据>文件
var Folder = new Schema({
'name' : String,
'isFile' : Number,
'children' : [Folder]
});
,我们可以做一些这样的事情???
我们如何创建一个分层架构的文件系统猫鼬模式像一个文件夹>子文件夹层次数据>文件
var Folder = new Schema({
'name' : String,
'isFile' : Number,
'children' : [Folder]
});
,我们可以做一些这样的事情???
您使用的模式将子文件夹嵌入到父项中。这可能会起作用,但它有一些问题。
首先是每个文件夹文档的大小可能会相当大,具体取决于文件系统的大小,并且可能遇到大小限制问题。
另一个问题是,它很难直接找到不在顶层的文档。
更好的解决方案是将父/子关系存储为引用。
var Folder = new Schema({
name: String,
isFile: Boolean,
parent: {
type: Schema.Types.ObjectId,
ref: 'Folder'
},
children: [{
type: Schema.Types.ObjectId,
ref: 'Folder'
}]
});
裁判属性只是表示该系列/型号猫鼬应该寻找被引用的文件,因此它可以找到它,如果你查询它。在这种情况下,我们引用一个父文件夹,它是一个文件夹,还有一个儿童文件列表,它们也是文件夹类型的文件。
将引用存储到父级允许您轻松遍历树,引用子级允许您从上到下生成树。
您可以使用Mongoose的populate
功能来引用参考文献中的详细信息。有关人口和参考资料的更多信息,请参阅the Mongoose documentation。
N.B.我将isFile
更改为Boolean
字段,因为我假设您尝试存储是/否值?
有用于存储在MongoDB的集合分层数据的一些记载的方法,我下面举:
你的选择将取决于你如何打算查询数据,每种方法都有其自身的优点和缺点。如果你需要,你可以简单地通过多个这些方法存储分层数据,但重要的是让它们保持更新。为此,我建议使用猫鼬插件。
我最喜欢的选择是物化的路径,因为它提供了在与该路径的工作,如通过局部路径寻找节点的更多的灵活性。
我引用一个例子从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 })
- 您可以使用常规的exp路径字段ressions找到编程的后代:
Model.find({ path: /,Programming,/ })
- 您还可以检索书籍的后裔,其中图书也处于最顶端层次结构的层次:
Model.find({ path: /^,Books,/ })
- 您可能要检索图书的直接孩子:
Model.find({ path: /,Books,$/ })
了解更多关于文档链接上面关于索引是“路径”字段更好的性能。
任何这些方法都可以通过您自己或通过猫鼬插件来实现,您可以通过在http://plugins.mongoosejs.com上搜索“树”来找到这些插件。
但是在哪里放置“文件夹”ref? – Steven 2014-08-06 18:27:20