Câu hỏi về lược đồ nào sẽ phù hợp nhất với loại mẫu truy cập mà bạn mô tả đã được trả lời trong một số ví dụ nói về cách biểu diễn hệ thống phân cấp trong cơ sở dữ liệu MongoDB / document.
Một câu trả lời phổ biến phù hợp với nhiều truy vấn khác nhau là nơi bạn lưu trữ trong mỗi tệp tên, kích thước, tệp cha trực tiếp và mảng của tất cả các tổ tiên của tệp đó.
Điều đó sẽ làm cho dữ liệu mẫu của bạn:
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 })
Bây giờ nếu bạn muốn truy vấn những thứ như "Các tệp trong thư mục này" hoặc "tất cả các tệp trong thư mục này (bao gồm cả đệ quy)", bạn truy vấn:
db.files.find( { parent: "root" } ) // all files in /src directory
db.files.find( {ancestors: "root"} ) // all files under /root directory tree
Vì bạn cần sử dụng khung tổng hợp để lấy những thứ như tổng, truy vấn về kích thước của thư mục sẽ là:
db.files.aggregate([
{$match:{ancestors:"src"}},
{$group:{
_id: "src",
total_size: {$sum:"$size"}
}
}
]);
Để xem kích thước của tất cả các thư mục trong thư mục gốc, nó sẽ là:
db.files.aggregate([
{$match:{ancestors:"root"}},
{$group:{
_id: "root",
total_size: {$sum:"$size"}
}
}
]);