Incremento automatico in MongoDB per memorizzare la sequenza di ID utente unico

Sto creando un sistema di analisi, la chiamata API fornirebbe un ID utente univoco, ma non è in sequenza e troppo scarso.

Devo assegnare a ciascun ID utente univoco un ID di incremento automatico per contrassegnare un punto di dati di analisi in un bitarray / bitset. Quindi il primo incontro utente corrisponderebbe al primo bit del bitarray, il secondo utente sarebbe il secondo bit nel bitarray, ecc.

Quindi esiste un modo solido e veloce per generare ID utente univoco incrementale in MongoDB?

Puoi, ma non dovresti http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field

Ogni object in mongo ha già un ID e sono ordinabili nell’ordine di inserimento. Cosa c’è di sbagliato nell’ottenere la raccolta di oggetti utente, iterandoci sopra e usarli come ID incrementato? Andare per tipo di mappa-ridurre completamente il lavoro

Come la risposta selezionata dice che è ansible utilizzare findAndModify per generare ID sequenziali.

Ma sono fortemente in disaccordo con l’opinione che non dovresti farlo. Tutto dipende dalle esigenze della tua azienda. Avere un ID 12-byte può essere molto dispendioso in termini di risorse e causare problemi di scalabilità significativi in ​​futuro.

Ho una risposta dettagliata qui .

Per prima cosa crea una collezione di contatori , che terrà traccia dell’ultimo valore di sequenza per tutti i campi della sequenza.

  db.createCollection("counters") 

Utilizzare il seguente codice per inserire questo documento sequenza nella raccolta contatori –

  db.counters.insert({_id:"tid",sequence_value:0}) 

Creazione della funzione Javascript:

  function getNextSequenceValue(sequenceName){ var sequenceDocument = db.counters.findAndModify({ query:{_id: sequenceName }, update: {$inc:{sequence_value:1}}, new:true }); return sequenceDocument.sequence_value; } 

Inserisci due documenti:

  db.products.insert({ "_id":getNextSequenceValue("tid"), "product":"Samsung", "category":"mobiles" }) db.products.insert({ "_id":getNextSequenceValue("tid"), "product":"Samsung S3", "category":"mobiles" }) 

Ottieni documenti inseriti:

  db.prodcuts.find() 

PRODUZIONE

{“_id”: 1, “prodotto”: “Samsung”, “categoria”: “cellulari”}

{“_id”: 2, “prodotto”: “Samsung S3”, “categoria”: “cellulari”}

So che questa è una vecchia domanda, ma posterò la mia risposta per i posteri …

Dipende dal sistema che stai costruendo e dalle particolari regole aziendali in atto.

Sto costruendo un CRM da moderato a grande scala in MongoDb, C # (Backend API) e Angular (web application Frontend) e ho trovato ObjectId assolutamente terribile da utilizzare in Angular Routing per la selezione di particolari quadro. Lo stesso con il routing di Controller API.

Il suggerimento sopra ha funzionato perfettamente per il mio progetto.

 db.contacts.insert({ "id":db.contacts.find().Count()+1, "name":"John Doe", "emails":[ "[email protected]", "[email protected]" ], "phone":"555111322", "status":"Active" }); 

Il motivo per cui è perfetto per il mio caso, ma non tutti i casi è che, come indicato nel commento precedente, se si eliminano 3 record dalla raccolta, si otterranno collisioni.

Le mie regole aziendali stabiliscono che, a causa dei nostri SLA interni, non è consentito cancellare i dati di corrispondenza o i record dei clienti più a lungo della durata potenziale dell’applicazione che sto scrivendo, e quindi, contrassegno semplicemente i record con un enum “Status” che è “Attivo” o “Cancellato”. È ansible eliminare qualcosa dall’interfaccia utente e verrà visualizzato il messaggio “Il contatto è stato eliminato”, ma l’intera applicazione ha modificato lo stato del contatto in “Eliminato” e quando l’app chiama il repository per un elenco di contatti, filtro eliminare i record eliminati prima di inviare i dati all’app client.

Pertanto, db.collection.find (). Count () + 1 è una soluzione perfetta per me …

Non funzionerà per tutti, ma se non cancellerai i dati, funzionerà correttamente.