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" }