2011-11-11 23 views

risposta

4

Dal docs ...

Se un utente tenta di inserire un documento senza fornire un campo _id, il database genererà automaticamente un oggetto ide conservarlo campo _id.

Tuttavia, è possibile assegnare il proprio valore alla _id ...

Il valore _id può essere di qualsiasi tipo, ad eccezione array, fino a quando si tratta di un unico .

La domanda migliore è il motivo per cui si dovrebbe creare il proprio ID univoco, creare un indice su di esso e rimuovere il molto utile ObjectID _id che è indicizzato automaticamente?

Tutti i piloti ufficiali utilizzare ObjectID e ha un sacco di ottimi aspetti ad esso:

  • E 'un timestamp costruito (in modo che non c'è bisogno di memorizzare un campo data nella vostra documento, e puoi usarlo per ordinare per data.)

  • È un "numero di sequenza globale, uniformemente crescente" --- vale a dire sarà ancora univoco tra i server se hai bisogno di dividere i tuoi dati, ecc.

+0

Grazie tu! Sono nuovo di MongoDB e ho perso la parte della documentazione che hai citato. E grazie per aver spiegato i vantaggi dell'utilizzo di ObjectID. Comunque, voglio usare il mio ID perché è un hash (e ho bisogno di memorizzarlo comunque nel mio documento), ed è più piccolo di ObjectID. –

+1

Felice di aiutare, è ovvio su ciò che è meglio per la tua applicazione, ma ho trovato che l'ObjectID è molto utile in una serie di situazioni a cui non avrei pensato quando ho iniziato. Divertiti, http://learnmongo.com potrebbe essere utile anche per te! –

+0

Grazie per l'ottimo link! –

2

No, non è possibile liberarsene, it is there by design, ma è possibile mappare l'identificativo univoco int allo _id stesso quando si inseriscono documenti.

2

Una buona idea è quella di memorizzare l'hash nel campo _id.

Pertanto, il database non creerà automaticamente il campo _id perché sarà già esistente e si salverà lo spazio di un indice inutilizzato.

Basta impostare il campo _id come qualsiasi altro con il valore desiderato (il tuo hash per esempio). Ma attenzione, deve essere unico!

Per garantire unicità si deve o renderlo unico o mettere un documento secondario nel campo _id: {_id: {h: [yourHash], u: [un identificatore univoco]} ...}

+0

Questo è esattamente quello che ho fatto, uccidendo due piccioni con un solo colpo: i miei documenti non contengono un enorme ObjectID e non ho bisogno di chiamare 'ensureIndex' dopo ogni inserto - Ho ottenuto un significativo aumento di velocità (non avrei mai pensato' ensureIndex 'è così lento). –

+1

@Viriolet Giraffe: Non c'è bisogno di chiamare 'ensureIndex' dopo ogni inserimento - deve solo essere chiamato una volta nella vita del database, proprio come con MySQL. Inoltre, 'ObjectID' non è davvero un campo 'enorme'. Tuttavia, sono d'accordo sul fatto che usare un hash abbia senso. Nella discussione sull'hash vs object id vs. guid, assicurati di comprendere le implicazioni a lungo termine della coerenza e delle potenziali chiavi shard. – mnemosyn

Problemi correlati