English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB 自动递增序列

MongoDB non ha funzionalità di incrementazione automatica pronte all'uso come i database SQL. Di default, esso_idIl campo ObjectId di 12 byte serve come chiave primaria per identificare univocamente il documento. Tuttavia, in alcune circostanze, potremmo voler che il campo _id abbia un valore automaticamente incrementale oltre all'ObjectId.

Poiché questa non è una funzione predefinita in MongoDB, la implementeremo utilizzando}}countersLa documentazione dei documenti MongoDB suggerisce di implementare questa funzione programmatically.

Utilizza la collezione dei contatori

Vedi di seguitoproductsIl campo _id dovrebbe essere una sequenza auto-incrementale di interi da 1,2,3,4 a n.

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

Per fare questo, crea uncountersQuesta collezione traccia l'ultimo valore di sequenza di tutti i campi di sequenza.

>db.createCollection("counters")

Ora, creeremo il seguente documentoproductidInserisci come chiave nella collezione counters-

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

Il campo sequence_value traccia l'ultimo valore della sequenza.

Inserisci questo documento di sequenza nella collezione counters utilizzando il seguente codice-

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

Creare una funzione JavaScript

Ora, creeremo una funzionegetNextSequenceValueQuesta funzione prende il nome della sequenza come input, aggiunge 1 al numero di sequenza e restituisce il numero di sequenza aggiornato. Nel nostro esempio, 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;
}

Utilizza la funzione JavaScript

Ora, utilizzeremo la funzione getNextSequenceValue quando creiamo un nuovo documento e assegniamo il valore di sequenza restituito al campo _id del documento.

Inserisci i seguenti codici per aggiungere due documenti di esempio-

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

正如您看到的,我们使用了getNextSequenceValue函数来设置_id字段的值。

为了验证功能,让我们使用find命令获取文档-

>db.products.find()

上面的查询返回了具有自动递增的_id字段的以下文档-

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