我正在阅读 2.2 的 Mongo Shard 密钥的文档,发现它有点混乱。
所有分片集合必须有一个以分片键开头的索引。如果您对尚未包含文档且没有此类索引的集合进行分片,则 shardCollection 将在分片键上创建索引。如果集合已包含文档,则必须在使用 shardCollection 之前创建适当的索引。
在 2.2 版更改: shard key 上的索引不再需要与 shard key 相同。该索引可以像以前一样是分片键本身的索引,也可以是分片键是索引前缀的复合索引。此索引不能是多键索引。
如果您有一个名为 people 的集合,使用字段 { zipcode: 1 } 进行分片,并且您想将其替换为字段 { zipcode: 1, username: 1 } 上的索引,则:
在 { zipcode: 1, username: 1 } 上创建索引: db.people.ensureIndex( { zipcode: 1, username: 1 } ); 当 MongoDB 完成索引构建后,您可以安全地删除 { zipcode: 1 } 上的现有索引: db.people.dropIndex( { zipcode: 1 } ); 警告分片键上的索引不能是多键索引。如上所述,如果用户名字段没有数组值,则 { zipcode: 1, username: 1 } 上的索引只能替换 zipcode 上的索引。
如果您删除了分片键的最后一个适当索引,请通过仅在分片键上重新创建索引来恢复。
我有几个关于分片键和索引的问题。
i) 从文档来看,2.2 之前似乎支持多键索引。如果是这种情况,复合索引与多键索引有何不同?
ii) [a] 以分片键开头的索引和 [b] 以分片键为前缀的索引有什么区别?
iii)关于分片键上的索引不应该是多键索引的警告说明是什么?db.people.ensureIndex( { zipcode: 1, username: 1 } 不是多键索引吗?