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" }
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程