递归查询?

问题描述:

我是新来的mongodb。递归查询?

比方说,我有我的数据库中的“文件系统”层次结构:

db.directories.save({ _id: "root", directories: ["src", "lib"], files: ["config.cfg"] }) 
db.directories.save({ _id: "src", directories: [], files: ["file1.js", "file2.js"] }) 
db.directories.save({ _id: "lib", directories: [], files: [] }) 

db.files.save({ _id: "config.cfg", size: 2310 }) 
db.files.save({ _id: "file1.js", size: 5039 }) 
db.files.save({ _id: "file2.js", size: 1299 }) 

我将如何得到一个文件夹的总大小?

即“根”目录的总规模=文件的总大小+子目录

+0

一般你会根据你想运行,而不是周围的其他方式查询的设计架构。在当前模式中,没有办法在单个查询中执行您想要的操作。 – 2013-02-13 03:54:26

+0

你会建议什么模式? – Bart 2013-02-13 13:00:31

什么架构将最适合你描述的一些例子会谈回答有关如何访问模式的类型问题的总规模代表MongoDB /文档数据库中的层次结构。

适用于大量不同查询的常见答案是,您在每个文件中存储其名称,大小,直接父级和所有祖先的数组。

这将使您的样本数据:如果您想查询的东西,如“文件放在这个目录”或“所有文件此目录下(包括递归)”

db.files.save({ _id: "root"}) 
db.files.save({ _id: "src", parent: "root", ancestors: ["root"] }) 
db.files.save({ _id: "lib", parent: "root", ancestors: ["root"]}) 
db.files.save({ _id: "config.cfg", parent: "root", ancestors: ["root"], size: 2310 }) 
db.files.save({ _id: "file1.js", parent: "src", ancestors: ["root","src"], size: 5039 }) 
db.files.save({ _id: "file2.js", parent: "src", ancestors: ["root","src"], size: 1299 }) 

现在您查询:

db.files.find({ parent: "root" }) // all files in /src directory 
db.files.find({ancestors: "root"}) // all files under /root directory tree 

既然你需要使用聚合框架得到的东西像总和,对文件夹的大小的查询是:

db.files.aggregate([ 
     {$match:{ancestors:"src"}}, 
     {$group:{ 
      _id: "src", 
      total_size: {$sum:"$size"} 
      } 
     } 
]); 

要查看哪些是在根文件夹中的所有文件夹的大小将是:

db.files.aggregate([ 
     {$match:{ancestors:"root"}}, 
     {$group:{ 
      _id: "root", 
      total_size: {$sum:"$size"} 
      } 
     } 
]); 
+0

你的例子帮了我很多 – 2016-06-24 06:43:58