2017-06-13 115 views
0

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

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

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

所以这里的问题是,用户表可以是巨大的,我决定创建基于这两个字段的复合索引。蒙戈文档说:

当使用$或疑问,一个$的每个条款索引或可以使用其 自己的索引。考虑以下查询:

db.inventory.find({$或:[{量:{$ LT:20}},{价:10}] })

为了支持这个查询,而比一个复合索引,你会 创建量的一种指数,并在价格另一个指数:

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

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

MongoDB可以使用除了geoHaystack索引以外的所有其他地方都支持$或子句。

所以现在我有3个选项:

  • 复合索引

  • 两个指标

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

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

+1

如果你不知道它是什么,那么你根本就不用它。我认为最好的文件很清楚,不是吗?我的意思是你实际上包括了确认你的问题要做什么的那部分。 –

回答

2

您应该使用两个单独的索引。如果你创建了一个复合索引,它对于两个$或options中的至多一个都是有用的。

与您$或查询,这两部分将采取行动很像单独的查询:

  1. db.users.find({ user_email: email })
  2. db.users.find({ user_name: name })

如果创建一个复合索引,请说USER_EMAIL然后USER_NAME,那么第一个查询将能够有效地使用这个 - 但第二个查询不会。优化查询的两个部分的唯一方法是使用单独的索引,每个字段都有一个索引。