我们如何为文件系统创建分层模式
var Folder = new Schema({
'name' : String,
'isFile' : Number,
'children' : [Folder]
});
我们可以做这样的事吗???
答案 0 :(得分:8)
您使用的架构将子文件夹嵌入父项中。这可能会奏效,但它有一些问题。
首先,每个文件夹文档的大小可能会非常大,具体取决于文件系统的大小,并且您可能会遇到大小限制的问题。
另一个问题是,直接查找不在顶层的文档非常困难。
更好的解决方案是将父/子关系存储为引用。
var Folder = new Schema({
name: String,
isFile: Boolean,
parent: {
type: Schema.Types.ObjectId,
ref: 'Folder'
},
children: [{
type: Schema.Types.ObjectId,
ref: 'Folder'
}]
});
ref属性只是指示哪个Collection / Model mongoose应该查找引用的文档,所以如果你查询它就可以找到它。在这种情况下,我们引用父文件夹,它是一个文件夹,以及一个孩子列表,它们也是文件夹类型的文件。
存储对父项的引用可以让您轻松遍历树,对子项的引用允许您从上到下生成树。
您可以使用Mongoose的populate
功能从引用中提取详细信息。有关人口和参考资料的更多信息,请参阅the Mongoose documentation。
N.B。我将isFile
更改为Boolean
字段,因为我假设您尝试存储是/否值?
答案 1 :(得分:6)
有一些文档化的方法可以在MongoDB集合中存储分层数据,我在下面列举:
您的选择将主要取决于您打算如何查询数据,每种方法都有各自的优缺点。如果需要,您可以一次性通过多种方法存储分层数据,但保持更新非常重要。为此,我建议使用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 } )
- 您可以在路径字段上使用正则表达式来查找编程的后代:
醇>
Model.find( { path: /,Programming,/ } )
- 您还可以检索Books的后代,其中Books也位于层次结构的最顶层:
醇>
Model.find( { path: /^,Books,/ } )
- 您可能想要检索图书的直接子项:
醇>
Model.find( { path: /,Books,$/ } )
在上面的文档链接上阅读更多关于索引“路径”字段以获得更好性能的信息。
任何这些方法都可以由您自己或通过mongoose插件实现,您可以通过在http://plugins.mongoosejs.com上搜索“树”来找到它。
答案 2 :(得分:0)
您使用了mongoose-tree或mongoose-materialized
答案 3 :(得分:0)
所以如果我理解正确的话,它会是这样的吗?
const FolderSchema = new Schema({
name: String,
isFile: Boolean,
parent: {
type: Schema.Types.ObjectId,
ref: 'Folder'
},
files: [{
name: { type: String, required: true, max: 100 },
encodedName: { type: String, required: false, max: 100, default: null },
}],
owner: { type: ObjectId, ref: 'User' },
team: { type: ObjectId, ref: 'Team' }
});
const Folder = mongoose.model('folders', FolderSchema);
module.exports = {
Schema: FolderSchema,
Folder
};