情况: 我有用户信息的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索引(稍微阅读一下,似乎它可以搜索“最接近”的索引条目。不确定这是我应该使用的方式)
你们可以给我一些关于这个特定用例的索引选择的提示吗?
答案 0 :(得分:2)
您应该使用两个单独的索引。如果您创建一个复合索引,它将对两个$或选项中的至多一个有用。
使用您的$或查询,这两个部分的行为就像是单独的查询:
db.users.find( { user_email: email } )
db.users.find( { user_name: name } )
如果你创建一个复合索引,比如在user_email然后是user_name,那么第一个查询将能够有效地使用它 - 但第二个查询不会。优化查询的两个部分的唯一方法是使用单独的索引,每个字段一个。