如何在MongoDB中搜索深层树状结构?

时间:2013-09-04 19:18:40

标签: mongodb database

解释我的情况的最简单方法是使用标准文件系统结构,这与我想要完成的工作接近:

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 。我怎么能这样做?

3 个答案:

答案 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来填补。

希望这有帮助