所以我需要一些关于我做错的建议。
我的数据库设置与由folders
和files
组成的文件系统完全相同。
它以文件夹开头,但可以有相对无限数量的子文件夹和/或文件。
{
"name":"folder1",
"uniqueID":"zzz0",
"subcontents": [ {"name":"subfolder1", "uniqueID":"zzz1"},
{"name":"subfile1", "uniqueID":"zzz2"},
{"name":"subfile2", "uniqueID":"zzz3"},
{"name":"subfolder2", "subcontents": [...etc...], "uniqueID":"zzz4"},
]
}
每个文件夹/文件文档都有一个唯一ID,以便我可以引用它(见上面的zzz#)。我的问题是,我可以制作一个mongoDB查询来只提取一个文档吗?
比如说例如db.fileSystemCollection.find({"uniqueID":"zzz4"})
,它会给我以下结果吗?我必须使用索引来执行此操作吗?我一直在尝试,但每次查询都返回空。
预期结果---> {“name”:“subfolder2”,“subcontents”:[... etc ...],“uniqueID”:“zzz4”}
[编辑] 根据下面的响应,我将考虑在mongoDB上使用XML数据库。 json结构不能重新排列以与MongoDB一起使用(数据太多)。
答案 0 :(得分:3)
简短的回答是否定的,正如克里斯所说。
您对树的嵌入表示非常适合直观理解(以及实现)。但是,如果您希望使用MongoDB中的索引在树上进行有效搜索,则可以考虑采用另一种树存储方式。 http://docs.mongodb.org/manual/tutorial/model-tree-structures/
列出了一系列方法请注意,根据您的访问模式,每个表示都有自己的优缺点。
由于类似文件系统的结构,它可能能够找到给定文件夹的所有子内容,因此您可以使用子引用模式:
{
"name":"folder1",
"uniqueID":"zzz0",
"subcontents": [ "zzz1",
"zzz2",
"zzz3",
"zzz4"
]
}
{
"name":"subfolder1",
"uniqueID":"zzz1"
}
...
答案 1 :(得分:1)
没有;搜索{uniqueID: "zzz4"}
只会获得顶级唯一ID匹配的文档。
您可能想要的是在文档上维护一个列出该树中所有唯一ID的数组。所以你的文件将是:
{
"name":"folder1",
"uniqueID":"zzz0",
"idList": ["zzz0", "zzz1", "zzz2", "zzz3", "zzz4"],
"subcontents": [ {"name":"subfolder1", "uniqueID":"zzz1"},
{"name":"subfile1", "uniqueID":"zzz2"},
{"name":"subfile2", "uniqueID":"zzz3"},
{"name":"subfolder2", "subcontents": [...etc...], "uniqueID":"zzz4"},
]
}
然后你可以索引:
db.fileSystemCollection.ensureIndex({"idList": 1})
然后你可以找到它:
db.fileSystemCollection.find({"idList": "zzz4})
那将归还给你那些文件。
顺便说一句,如果你试图在Mongo中存储文件,你看过GridFS吗?