30

フィールド「email」と「friends_email」を持つコレクションがあります。MongoDB を使用して、次のような一意性制約を設定したいと思います。

  1. email と friends_email の値が同じになるレコードはありません。したがって、これは無効になります。

    {"email": "abc@example.com", "friends_email": "abc@example.com" }
    
  2. すべてのフィールドで同じ値を持つレコードは 2 つとありません。したがって、次の例はすべて無効になります。

    {
        { "email": "abc@example.com", "friends_email": "def@example.com" },
        { "email": "abc@example.com", "friends_email": "def@example.com" }
    }
    {
        { "email": "abc@example.com", "friends_email": null },
        { "email": "abc@example.com", "friends_email": null }
    }
    {
        { "email": null, "friends_email": "abc@example.com" },
        { "email": null, "friends_email": "abc@example.com" }
    }
    

    平易な英語で言うと、and の連結はemail一意friends_emailになり、nullandundefinedは空の文字列に合体します。

MongoDB でこのルールを適用する最善の方法は何ですか?

4

4 に答える 4

52

複合一意インデックスが必要なようです。

db.users.createIndex( { "email": 1, "friends_email": 1 }, { unique: true } )

...そして、ORM 層で email =/= friends_email であることを確認できます。

于 2013-02-04T18:50:04.823 に答える
8

2 番目のケースを確実にするためにemail、フィールドに複合一意インデックスを設定できます。friends_emailただし、最初のケースでは、アプリケーション コードでそれを処理するか、Morphia などの Java マッパーを使用してフィールド ベースの検証を行う必要があります。次の投稿も確認してください。

MongoDB で制約を適用する方法は?

于 2013-02-04T18:49:34.847 に答える
7

2 番目のケースでは、探しているのは一意の複合インデックスですか?

 db.emails.ensureIndex( {email:1, friends_email:1}, { unique: true } )

最初のケースに関しては、最初のルールを強制する方法があるかどうかはわかりません。アプリケーション側でチェックを実行する必要がある場合があります。

于 2013-02-04T18:53:17.947 に答える