MongoDB - Sequenza di incremento automatico

MongoDB non ha funzionalità di incremento automatico predefinite, come i database SQL. Per impostazione predefinita, utilizza ObjectId a 12 byte per_idcampo come chiave primaria per identificare in modo univoco i documenti. Tuttavia, potrebbero esserci scenari in cui si potrebbe desiderare che il campo _id abbia un valore incrementato automaticamente diverso da ObjectId.

Poiché questa non è una funzionalità predefinita in MongoDB, realizzeremo questa funzionalità a livello di codice utilizzando un file counters raccolta come suggerito dalla documentazione di MongoDB.

Utilizzo di Counter Collection

Considera quanto segue productsdocumento. Vogliamo che il campo _id sia unauto-incremented integer sequence a partire da 1,2,3,4 fino a n.

{
  "_id":1,
  "product_name": "Apple iPhone",
  "category": "mobiles"
}

Per questo, crea un file counters raccolta, che terrà traccia dell'ultimo valore della sequenza per tutti i campi della sequenza.

>db.createCollection("counters")

Ora inseriremo il seguente documento nella raccolta dei contatori con productid come chiave -

> db.counters.insert({
	"_id":"productid",
	"sequence_value": 0
})
WriteResult({ "nInserted" : 1 })
>

Il campo sequence_value tiene traccia dell'ultimo valore della sequenza.

Usa il codice seguente per inserire questo documento di sequenza nella raccolta dei contatori:

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

Creazione della funzione Javascript

Ora creeremo una funzione getNextSequenceValueche prenderà il nome della sequenza come input, incrementerà il numero di sequenza di 1 e restituirà il numero di sequenza aggiornato. Nel nostro caso, il nome della sequenza èproductid.

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

Utilizzo della funzione Javascript

Ora useremo la funzione getNextSequenceValue durante la creazione di un nuovo documento e l'assegnazione del valore della sequenza restituito come campo _id del documento.

Inserisci due documenti di esempio utilizzando il codice seguente:

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"
})
>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"
})

Come puoi vedere, abbiamo utilizzato la funzione getNextSequenceValue per impostare il valore per il campo _id.

Per verificare la funzionalità, recuperiamo i documenti utilizzando il comando find -

>db.products.find()

La query precedente ha restituito i seguenti documenti con il campo _id autoincrementato:

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }