Mongodb 递归查询?

Mongodb 递归查询?,mongodb,recursion,hierarchy,Mongodb,Recursion,Hierarchy,我是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", direc

我是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 })
如何获得文件夹的总大小


i、 e.“根”目录的总大小=文件的总大小+子目录的总大小

关于什么模式最适合您描述的访问模式类型的问题在一些示例中回答了关于如何在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
因为您需要使用聚合框架来获取sum之类的内容,所以对文件夹大小的查询应该是:

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"}
          }
       }
]);
要查看根文件夹中所有文件夹的大小,请执行以下操作:

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"}
          }
       }
]);

通常,您会根据要运行的查询来设计模式,而不是相反。在当前模式中,无法在单个查询中实现您想要的功能。您建议使用什么模式?您的示例对我帮助很大