0

所以我需要一些关于我做错了什么的建议。

我的数据库的设置与由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 一起使用(数据过多)。

4

2 回答 2

3

正如克里斯所说,简短的回答是否定的。

您对树的嵌入式表示非常适合直观理解(以及实现)。但是,如果您想允许在 MongoDB 中使用索引对您的树进行有效搜索,您可能会考虑另一种树存储方式。在http://docs.mongodb.org/manual/tutorial/model-tree-structures/列出了一堆方法

请记住,每种表示方式都有其优缺点,具体取决于您的访问模式。

由于对于类似文件系统的结构,它可能能够找到给定文件夹的所有子内容,因此您可以为此使用子引用模式:

{
   "name":"folder1",
   "uniqueID":"zzz0",
   "subcontents": [ "zzz1", 
                    "zzz2", 
                    "zzz3", 
                    "zzz4" 
                  ] 
}

{
  "name":"subfolder1", 
  "uniqueID":"zzz1"
}

...
于 2013-04-18T02:46:59.903 回答
1

不; 搜索{uniqueID: "zzz4"}只会得到顶级 uniqueID 匹配的文档。

您可能想要的是在文档上维护一个数组,其中列出了该树中的所有唯一 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吗?

于 2013-04-18T01:10:54.447 回答