4

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

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

4

3 回答 3

5

我推荐这个主题的MongoDb官方文档。将树存储在数据库中并非易事,每种解决方案都有其优缺点。我成功地体验了物化路径模型,该模型在层次搜索方面非常有效,但在树修改方面代价高昂,因为您必须更新每个后代节点。

于 2013-09-05T07:38:34.393 回答
2

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

{ _id, name, type, parent: { grandparent : { parentOfGrandparent : {..........

因此,要搜索文件夹 A 的所有文件,您要搜索父级为“文件夹 A”的所有文件。我认为这会起作用:

db.files.find( { parent : { "Folder A : { $exists: true } } } );
于 2013-09-05T08:01:41.167 回答
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 来填充父级。

希望这可以帮助

于 2013-09-04T20:37:01.877 回答