我正确使用这个mongoDB的索引吗?

时间:2013-04-18 00:08:46

标签: mongodb database nosql

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

我的数据库设置与由foldersfiles组成的文件系统完全相同。 它以文件夹开头,但可以有相对无限数量的子文件夹和/或文件。

{
   "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一起使用(数据太多)。

2 个答案:

答案 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吗?