MongoDB 自增序列
MongoDB没有像SQL数据库那样支持开箱即用的自增功能。默认情况下,MongoDB使用12字节的ObjectId作为主键来唯一标识文档中的 _id 字段。然而,有些场景下我们可能希望_id字段具有一些自增的值,而不是使用ObjectId。
鉴于这在MongoDB中不是默认功能,我们可以根据MongoDB文档的建议,通过使用一个 counters 集合来编程实现这个功能。
使用计数器集合
考虑以下 products 文档。我们希望_id字段是一个 自增整数序列 ,从1、2、3、4一直到n。
{
"_id":1,
"product_name": "Apple iPhone",
"category": "mobiles"
}
为此,创建一个 counters 集合,用于跟踪所有序列字段的最后一个序列值。
>db.createCollection("counters")
现在,我们将使用以下文档将其插入到计数器集合中,其键为 productid -
> db.counters.insert({
"_id":"productid",
"sequence_value": 0
})
WriteResult({ "nInserted" : 1 })
>
字段 sequence_value 用于跟踪序列的最后一个值。
使用以下代码将该序列文档插入计数器集合中 −
>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函数
现在我们将在创建新文档时使用函数getNextSequenceValue,并将返回的序列值分配为文档的_id字段。
使用以下代码插入两个示例文档−
>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" }