2013-05-13 25 views

回答

7

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

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

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

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

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字段,因为我假设您尝试存储是/否值?

+1

但是在哪里放置“文件夹”ref? – Steven 2014-08-06 18:27:20

0

你必须使用鼬树或猫鼬物化

+0

有关此事的细节将不胜感激 – stealthjong 2014-06-13 09:07:18

5

有用于存储在MongoDB的集合分层数据的一些记载的方法,我下面举:

  1. 子引用
  2. 家长参考
  3. 一组祖先
  4. 物化路径
  5. Nes特德集

你的选择将取决于你如何打算查询数据,每种方法都有其自身的优点和缺点。如果你需要,你可以简单地通过多个这些方法存储分层数据,但重要的是让它们保持更新。为此,我建议使用猫鼬插件。

我最喜欢的选择是物化的路径,因为它提供了在与该路径的工作,如通过局部路径寻找节点的更多的灵活性。

我引用一个例子从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," } 
  1. 可以查询检索整个树,由田间小路排序:
Model.find().sort({ path: 1 }) 
  1. 您可以使用常规的exp路径字段ressions找到编程的后代:
Model.find({ path: /,Programming,/ }) 
  • 您还可以检索书籍的后裔,其中图书也处于最顶端层次结构的层次:
  • Model.find({ path: /^,Books,/ }) 
    
  • 您可能要检索图书的直接孩子:
  • Model.find({ path: /,Books,$/ }) 
    

    了解更多关于文档链接上面关于索引是“路径”字段更好的性能。

    任何这些方法都可以通过您自己或通过猫鼬插件来实现,您可以通过在http://plugins.mongoosejs.com上搜索“树”来找到这些插件。

    相关问题