- MongoDB 教程
- MongoDB - 首页
- MongoDB - 概述
- MongoDB - 优点
- MongoDB - 环境
- MongoDB - 数据建模
- MongoDB - 创建数据库
- MongoDB - 删除数据库
- MongoDB - 创建集合
- MongoDB - 删除集合
- MongoDB - 数据类型
- MongoDB - 插入文档
- MongoDB - 查询文档
- MongoDB - 更新文档
- MongoDB - 删除文档
- MongoDB - 投影
- MongoDB - 限制记录
- MongoDB - 排序记录
- MongoDB - 索引
- MongoDB - 聚合
- MongoDB - 复制
- MongoDB - 分片
- MongoDB - 创建备份
- MongoDB - 部署
- MongoDB - Java
- MongoDB - PHP
- 高级 MongoDB
- MongoDB - 关系
- MongoDB - 数据库引用
- MongoDB - 覆盖查询
- MongoDB - 分析查询
- MongoDB - 原子操作
- MongoDB - 高级索引
- MongoDB - 索引限制
- MongoDB - ObjectId
- MongoDB - Map Reduce
- MongoDB - 文本搜索
- MongoDB - 正则表达式
- 使用 Rockmongo
- MongoDB - GridFS
- MongoDB - 有帽集合
- 自动递增序列
- MongoDB 有用资源
- MongoDB - 问题和解答
- MongoDB - 快速指南
- MongoDB - 有用资源
- MongoDB - 讨论
MongoDB - 自动递增序列
MongoDB 没有开箱即用的自动递增功能,如 SQL 数据库。默认情况下,它使用 12 字节的 ObjectId 作为_id 字段的主键,以唯一标识文档。但是,在某些情况下,我们可能希望 _id 字段具有某个自动递增的值,而不是 ObjectId。
由于这不是 MongoDB 的默认功能,因此我们将使用 MongoDB 文档中建议的计数器集合以编程方式实现此功能。
使用计数器集合
考虑以下产品文档。我们希望 _id 字段为从 1、2、3、4 到 n 开始的自动递增整数序列。
{
"_id":1,
"product_name": "Apple iPhone",
"category": "mobiles"
}
为此,创建一个计数器集合,它将跟踪所有序列字段的最后一个序列值。
>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 函数
现在,我们在创建新文档并将其返回的序列值分配为文档的 _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.products.find()
上述查询返回了以下具有自动递增 _id 字段的文档 -
{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }
广告