我读了2.2的Mongo键的文档,发现它有点混乱。
所有已切分的集合都必须有一个以切分键开头的索引。如果您分割一个尚未包含文档的集合,并且没有这样的索引,则shardCollection将在shard键上创建一个索引。如果集合已经包含文档,则必须在使用shardCollection之前创建适当的索引。 在2.2版中进行了更改:碎片键上的索引不再需要与shard键相同。这个索引可以像以前一样是切分键本身的索引,或者是一个复合索引,其中碎片键是索引的前缀。这个索引不能是多键索引。 如果您有一个名为people的集合,并且使用字段{ zipcode: 1 }进行切分,并且您希望用字段{ zipcode: 1,用户名:1 }上的索引来替换它,那么: 在{ zipcode: 1,username: 1 }:db.people.ensureIndex( { zipcode: 1,username: 1})上创建一个索引;当MongoDB完成对该索引的构建时,您可以安全地删除{ zipcode: 1 }:db.people.dropIndex( { zipcode: 1})上的现有索引;警告切分键上的索引不能是多键索引。如前所述,{ zipcode: 1,用户名:1}上的索引只能在用户名字段没有数组值时才能替换。 如果您删除了碎片键的最后一个适当的索引,请通过仅在shard键上重新创建一个索引来恢复。
我有几个关于切碎键和索引的问题。
从文档来看,多键索引在2.2之前就得到了支持。如果是这样的话,复合索引与多键索引有何不同?
(二)有一个以切分键开头的索引和以一个切分键作为前缀的索引之间有什么区别?
(三)关于切分键上的索引的警告说明不应该是多键索引?db.people.ensureIndex( { zipcode: 1,username: 1})不是一个多键索引吗?
发布于 2012-08-23 17:30:23
复合索引与多键索引有何不同?:
复合索引是类似于您在示例中描述的索引:
{ zipcode: 1, username: 1 }
多键索引是对数组中的项进行索引的索引,如tags上的索引,用于返回包含“mongoDB”标记的所有文档,
有一个以切分键开头的索引和以一个切分键作为前缀的索引之间的区别是什么?:
没什么。
关于切分键上的索引的警告说明不应该是多键索引?:
当您考虑到多键索引是数组上的索引时,这是相当有意义的。考虑一下标签数组上的索引。如果一个文档在数组中有正确的值集合,那么它可以很容易地存在于许多(或全部)碎片中。
换句话说,文档仍然必须基于单个值进行切分,而不是对象或数组。
发布于 2012-08-20 21:41:29
我注意到索引的MongoDB文档可能造成了混乱。多键索引是为数组中的每个元素创建单独索引条目的一种方法:http://www.mongodb.org/display/DOCS/Multikeys。另一方面,复合索引在两个或多个字段( http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeys )上创建索引条目。
如果key代码是shard键,那么这些索引就可以工作了:
db.people.ensureIndex({ zipcode: 1})
db.people.ensureIndex({ zipcode: 1, username: 1 }) 多键索引的示例:
{_id: 1, array: [{zipcode: x}, {username: y}]}
db.people.ensureIndex({array: 1}) https://stackoverflow.com/questions/12043724
复制相似问题