2013-02-13 199 views
2

我是新來的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

回答

9

什麼架構將最適合你描述的一些例子會談回答有關如何訪問模式的類型問題的總規模代表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