如何在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 } } } );