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

如何在MongoDB中搜索深树状结构?,mongodb,database,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 因此,基本上,一个文件可能在层次结

解释我的情况最简单的方法是使用标准文件系统结构,它接近我想要实现的目标:

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下的每个文件。我怎样才能做到这一点?

我将按照以下模式进行操作:

集合名称文件:

{
 _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来填充父级


希望这有帮助

我推荐MongoDb官方文档。在数据库中存储树是非常重要的,每个解决方案都有其优缺点。
我成功地体验了物化路径模型,它在层次搜索上非常有效,但在树修改上非常昂贵,因为您必须更新每个子节点

根本不要将它们作为树存储在mongo!就像卢卡斯说的,这是一个很好的解释你是如何做到的。 但您的问题是需要从根目录到文件夹a的链接联接。您可以执行以下操作:

{ _id, name, type, parent: { grandparent : { parentOfGrandparent : {..........
因此,要搜索文件夹A的所有文件,您需要搜索父级为“文件夹A”的所有文件。 我认为这会奏效:

db.files.find( { parent : { "Folder A : { $exists: true } } } );