0

非常に小さくて単純なユースケースでMongoDBを最適に使用する方法を見つけようとしていますが、ドキュメントがやや混乱しています。私のドキュメントは、ユーザーが多くの電子メールを持つことができるという事実を表す必要があります。ドキュメントに従えば、最も明白で簡単な解決策は埋め込みを使用することです。問題は、電子メールアドレスの一意性を検証したい場合です。これは、埋め込みでは不可能です (もちろん、map/reduce を使用できますが、非常に悪い選択のようです)。

私は間違いなく、電子メールが独自のコレクションに値しないと感じていますが、明らかに埋め込みオブジェクトでは検証を行うことができません (もしそうなら、それが効率的であるとは本当に信じていません)。この状況でスキーマをどのように設計しますか?

4

1 に答える 1

2

{unique:true}を設定して、メールサブフィールドにインデックスを定義できます。これにより、電子メールアドレスの複数のコピーがコレクションに保存されるのを防ぐことができます。

たとえば、ドキュメントが次のようになっているとします。

db.users.findOne() => 
{ 
  "name" : "xxxx", 
  "emails" : [ 
     { address: "one@domain.com", validated: false },
     { address: "two@domain.com", validated: true }
  ]
}

次のように、email.addressフィールドに一意のインデックスを定義できます。

db.users.ensureIndex(['emails.address',1], {unique: true})

同じメールアドレスを2回挿入しようとすると、エラーが発生します。また、ある時点でアプリで役立つはずのメールアドレスでユーザーを検索するのを最適化するのにも役立ちます。

于 2011-02-09T20:41:59.080 に答える