离线下载
PDF版 ePub版

极客学院团队出品 · 更新于 2018-07-19 23:00:42

自动增长

MongoDB 没有提供类似 SQL 数据库所具有的自动增长功能(auto-increment)。默认情况下,MongoDB 将 _id 字段(使用 12 字节的 ObjectId)来作为文档的唯一标识。但在有些情况下,我们希望 _id 字段值能够自动增长,而不是固守在 ObjectId 值上。

由于这不是 MongoDB 的默认功能,所以我们按照 MongoDB 文档所建议的方式,使用 counters 集合来程序化地实现该功能。

使用 counters 集合

假设存在下列文档 products,我们希望 _id 字段值是一个能够自动增长的整数序列(1、2、3、4 …… n)。

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

创建一个 counters 集合,其中包含了所有序列字段最后的序列值。

>db.createCollection("counters")

现在,将下列文档(productid 是它的键)插入到 counters 集合中:

{
  "_id":"productid",
  "sequence_value": 0
}

sequence_value 字段保存了序列的最后值。

使用下列命令将序列文档插入到 counters 集合中。

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

创建 JavaScript 函数

接着,我们创建一个 getNextSequenceValue 函数,该函数以序列名为输入,按照 1 的幅度增加序列数,返回更新的序列数。在该例中,序列名称为 productid

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

使用 JavaScript 函数

下面,在创建新文档以及将返回的序列值赋予文档的 _id 字段过程中,我们使用 getNextSequenceValue 函数。

使用下列代码插入两个范例文档:

>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.prodcuts.find()

在上面的查询返回的结果文档中,_id 字段值果然是自动增长的:

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

{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }
上一篇: 固定集合