集册 Mongodb 教程 自动增长

自动增长

黑派客     最近更新时间:2020-08-04 05:37:59

341

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"})
展开阅读全文