2013-02-04 20 views
9

Ho una collezione con campi "email" e "friends_email". Vorrei installare un vincolo univoco-ness come il seguente, usando MongoDB:Unico vincolo con due campi in MongoDB

  1. Nessun record avrà lo stesso valore per la posta elettronica e friends_email. Quindi questo sarebbe valida:

    {"email": "[email protected]", "friends_email": "[email protected]" } 
    
  2. No 2 record avranno gli stessi valori per tutti i campi. Così i seguenti esempi non sarebbero valide:

    { 
        { "email": "[email protected]", "friends_email": "[email protected]" }, 
        { "email": "[email protected]", "friends_email": "[email protected]" } 
    } 
    { 
        { "email": "[email protected]", "friends_email": null }, 
        { "email": "[email protected]", "friends_email": null } 
    } 
    { 
        { "email": null, "friends_email": "[email protected]" }, 
        { "email": null, "friends_email': "[email protected]" } 
    } 
    

    In parole povere, sarebbe qualcosa di simile, la concatenazione di email e friends_email sarà unica, con null e undefined essere fuse in vuoto-stringa.

Qual è il modo migliore per applicare questa regola in MongoDB?

risposta

23

Suona come avete bisogno di un indice univoco composto:

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

... e si può verificare al livello ORM quell'email =/= friends_email.

+2

Un semplice aggiornamento su questo: db.collection.ensureIndex (chiavi, opzioni) è deprecato dalla versione 3.0.0:> db.collection.ensureIndex() è ora un alias per db.collection.createIndex(). –

3

È possibile avere indice univoco composto sul campo email e friends_email per garantire il secondo caso. Ma per il primo caso è necessario gestirlo nel codice dell'applicazione o utilizzare un mapper java come Morphia per avere una convalida basata sul campo. Si potrebbe desiderare di controllare il seguente post anche:

How to apply constraints in MongoDB?

3

per il secondo caso, è un indice composto unico che cosa stai cercando?

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

Per quanto riguarda il primo caso, io non sono sicuro se c'è un modo per far rispettare la prima regola. Potrebbe essere necessario eseguire il controllo sul lato dell'applicazione.

Problemi correlati