mongodb:多键索引结构?

时间:2011-09-13 02:36:43

标签: mongodb indexing mongodb-indexes

我发现很难理解mongodb中的多个键是如何完成索引的。

这是我在其网站上读到的关于mongodb docs中的多键的内容:
1)“在数组元素索引上创建索引会导致数据库索引数组的每个元素” 2)“...将索引文档上的所有标记,并为该文档创建”X“,”Y“和”Z“的索引条目。”

那么该文档的索引条目到底意味着什么呢?每个文档是否记住条目,在这种情况下,搜索将是一个全表扫描?或者它是与mysql相同的b-tree索引,其中每个索引条目将指向每个相应事件的多个文档,在这种情况下,我过度思考。

我们举一个例子:
obj1 = {
name: "Apollo",
text: "Some text about Apollo moon landings",
tags: [ "moon", "apollo", "spaceflight", "nasa" ]
}

obj2 = {
name: "Atlantis",
text: "Some text about Atlantis flight missions",
tags: [ "space", "atlantis", "spaceflight", "nasa" ]
}

>db.articles.ensureIndex( { tags : 1 } )

请帮我理解!提前谢谢。

2 个答案:

答案 0 :(得分:21)

在这种情况下,您的索引(这是一个B树)将如下所示:

 apollo => [ obj1 ]
 atlantis => [ obj2 ]
 moon => [ obj1 ]
 nasa  => [ obj1, obj2 ]
 space => [ obj2 ]
 spaceflight => [ obj1, obj2 ]

这只是一个“常规”B树索引,除了每个文档可以出现多次(每个唯一标记值出现一次)。

答案 1 :(得分:1)

我认为您误解了Multiindex和Compound索引之间的区别:

复合索引是多个字段的用户定义索引。 Multykey索引:MongoDB确定释放索引的字段是否为数组并为每个数组元素创建索引,例如

db.user.ensureIndex({ “address.street”:1});

在这种情况下,因为目标字段是一个数组,索引将存储所有项目但只存储一次。

我强烈建议你看一下这个简单的清单,它将澄清你对MongoDB中简单的imdex类型的怀疑:http://mongodbspain.com/en/2014/01/24/mongodb-indexes-part1/

此致