解释我的情况的最简单方法是使用标准文件系统结构,这与我想要完成的工作接近:
Folder A
- Folder A2
-- File 1
-- File 2
- File 3
Folder B
- Folder B2
- Folder B3
-- File 4
文件夹包含字段:
- _id
- parents (in my case there can actually be multiple!)
文件包含字段
- _id
- targetFolder
因此,基本上文件可能在层次结构中非常深。
如何有效地搜索和构建我的数据库,以便我可以拥有深层文件夹层次结构,其中任何一个都有文件。
我希望能够执行一个返回所有文件的查询。文件夹A 。我怎么能这样做?
答案 0 :(得分:5)
我推荐这个topic的MongoDb官方文档。在数据库中存储树是非常重要的,每个解决方案都有其优点和缺点。 我经历了成功的物化路径模型,这在层次搜索上非常有效,但在树修改上很昂贵,因为你必须更新每个后代节点。
答案 1 :(得分:2)
根本不将它们存储在mongo中的树上!就像卢卡斯所说,here对你如何做是一个很好的解释。 但是你的问题是你需要从根到文件夹A的链式连接。你可以做类似的事情:
{ _id, name, type, parent: { grandparent : { parentOfGrandparent : {..........
因此,要搜索文件夹A的所有文件,您需要搜索父文件夹为“文件夹A”的所有文件。 我认为这会奏效:
db.files.find( { parent : { "Folder A : { $exists: true } } } );
答案 2 :(得分:1)
我会做以下架构:
集合名称文件:
{
_id:id1 (generated unique id),
name: file2
type: file
parents:[id2,id3] -> parent directories FolderA2,FolderA
}
{
_id:id2 (generated unique id),
name: folderA2
type: directory
parents:[id3]
}
{
_id:id3 (generated unique id),
name: folderA
type: directory
parents:[]
}
然后,您可以在父项上构建一个多键索引并执行如下查询: db.files.find({“parents”:“id3”,“type”:“file”})查找文件夹A下的每个文件。此架构的下行是复杂的插入,因为添加新文件或文件夹(目录)父母必须通过从邻居文件或目录中获取父母的ID来填补。
希望这有帮助