Mongo DB复合索引

时间:2017-06-13 13:14:04

标签: mongodb indexing

情况: 我有用户信息的mongo db集合。在其他字段中,它包含一些user_email和user_login。这些字段应该是唯一的。 在注册期间,我想检查唯一性。我是通过

来做的
db.users.find( { $or: [ { user_email: email }, { user_name: name } ] } )

如果我能找到一些东西,我可以假设数据不是唯一的。

所以这里的问题是用户表可能很大,我决定根据这两个字段创建复合索引。 Mongo文档说:

  

当使用带有$或查询的索引时,$或者每个子句都可以使用它   自己的指数。请考虑以下查询:

     

db.inventory.find({$或:[{quantity:{$ lt:20}},{price:10}]   })

     

要支持此查询,而不是复合索引   在数量上创建一个指数,在价格上创建另一个指数:

     

db.inventory.createIndex({quantity:1})

     

db.inventory.createIndex({price:1})

     

MongoDB可以使用除geoHaystack索引之外的所有索引   支持$或条款。

所以现在我有3个选择:

  • 复合指数

  • 两个索引

  • geoHaysatck索引(稍微阅读一下,似乎它可以搜索“最接近”的索引条目。不确定这是我应该使用的方式)

你们可以给我一些关于这个特定用例的索引选择的提示吗?

1 个答案:

答案 0 :(得分:2)

您应该使用两个单独的索引。如果您创建一个复合索引,它将对两个$或选项中的至多一个有用。

使用您的$或查询,这两个部分的行为就像是单独的查询:

  1. db.users.find( { user_email: email } )
  2. db.users.find( { user_name: name } )
  3. 如果你创建一个复合索引,比如在user_email然后是user_name,那么第一个查询将能够有效地使用它 - 但第二个查询不会。优化查询的两个部分的唯一方法是使用单独的索引,每个字段一个。

相关问题