4

我们如何为文件系统创建分层架构

var Folder = new Schema({

  'name' : String,
  'isFile' : Number,
  'children' : [Folder]
});

我们可以做这样的事情吗???

4

4 回答 4

9

您使用的架构将子文件夹嵌入到父文件夹中。这可能会起作用,但它有几个问题。

首先是每个文件夹文档的大小可能会变得非常大,具体取决于文件系统的大小,并且您可能会遇到达到大小限制的问题。

另一个问题是很难直接找到不在顶层的文档。

更好的解决方案是将父/子关系存储为引用。

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 中查找引用的文档,因此如果您查询它,它可以找到它。在这种情况下,我们引用了一个父文件夹,它是一个文件夹,以及一个孩子列表,它们也是文件夹类型的文档。

存储对父级的引用允许您轻松地遍历树,对子级的引用允许您从上到下生成树。

您可以使用populateMongoose 的功能从参考资料中提取详细信息。有关人口和参考的更多信息,请参阅Mongoose 文档


注意我更改isFile为一个Boolean字段是因为我假设您正在尝试存储是/否值?

于 2013-05-13T09:11:11.290 回答
6

有一些记录在案的方法可以在 MongoDB 集合上存储分层数据,我在下面引用了这些方法:

  1. 子参考
  2. 父参考
  3. 祖先的数组
  4. 物化路径
  5. 嵌套集

您的选择将很大程度上取决于您打算如何查询数据,每种方法都有其优点和缺点。如果需要,您可以一次通过多个这些方法简单地存储分层数据,但保持更新很重要。为此,我推荐一个 mongoose 插件。

我最喜欢的选择是物化路径,因为它在使用路径时提供了更大的灵活性,例如通过部分路径查找节点。

我引用了MongoDB 文档中的一个例子:

以下示例使用物化路径对树进行建模,将路径存储在字段路径中;路径字符串使用逗号 , 作为分隔符:

{ _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," }
  1. 您可以查询以检索整个树,按字段路径排序:
Model.find().sort( { path: 1 } )
  1. 您可以在路径字段上使用正则表达式来查找 Programming 的后代:
Model.find( { path: /,Programming,/ } )
  1. 您还可以检索 Books 的后代,其中 Books 也位于层次结构的最顶层:
Model.find( { path: /^,Books,/ } )
  1. 您可能想要检索 Books 的直接子代:
Model.find( { path: /,Books,$/ } )

在上面的文档链接上阅读更多关于索引“路径”字段以获得更好性能的信息。

这些方法中的任何一种都可以自己实现,也可以通过 mongoose 插件实现,您可以通过在http://plugins.mongoosejs.com上搜索“tree”找到该插件。

于 2015-01-29T17:27:06.053 回答
0

You have use mongoose-tree or mongoose-materialized

于 2014-06-13T08:46:43.390 回答
0

所以如果我理解正确的话,matthewtole 会是这样的吗?

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
};
于 2021-01-28T03:41:33.390 回答