_id自动增长


  • Lv 1

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

登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待