2017-06-13 170 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,那麼第一個查詢將能夠有效地使用這個 - 但第二個查詢不會。優化查詢的兩個部分的唯一方法是使用單獨的索引,每個字段都有一個索引。