首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分层数据的Mongoose模式,如文件夹>子文件夹>文件

分层数据的Mongoose模式,如文件夹>子文件夹>文件
EN

Stack Overflow用户
提问于 2013-05-13 12:34:01
回答 4查看 6.9K关注 0票数 4

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

代码语言:javascript
运行
复制
var Folder = new Schema({

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

我们可以这样做吗?

EN

回答 4

Stack Overflow用户

发布于 2013-05-13 17:11:11

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

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

另一个问题是,它使得直接查找不在顶级的文档变得非常困难。

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

代码语言:javascript
运行
复制
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字段,因为我假设您正在尝试存储是/否的值?

票数 9
EN

Stack Overflow用户

发布于 2015-01-30 01:27:06

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

嵌套子路径引用数组References

  • Parent a of Ancestors
  1. Materialized

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

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

我引用了一个来自MongoDB docs的例子

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

代码语言:javascript
运行
复制
{ _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. 您可以查询以检索整个树,并按字段路径排序:

代码语言:javascript
运行
复制
Model.find().sort( { path: 1 } )

您可以在路径字段中使用正则表达式来查找Programming:的子体

代码语言:javascript
运行
复制
Model.find( { path: /,Programming,/ } )

  1. 您还可以检索图书的子代,其中图书也位于层次结构的最顶层:

代码语言:javascript
运行
复制
Model.find( { path: /^,Books,/ } )

  1. 您可能想要检索Books的直接子项:

代码语言:javascript
运行
复制
Model.find( { path: /,Books,$/ } )

阅读上面文档链接中关于索引"path“字段以获得更好性能的更多信息。

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

票数 6
EN

Stack Overflow用户

发布于 2014-06-13 16:46:43

您已经使用了mongoose-tree或mongoose-materialized

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16514912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档