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作为键,计数器集合如以下文档:

{
"_id":"productid",
"sequence_value": 0
}

字段 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.prodcuts.find()

上述查询返回下列文档具有自动递增_id字段:

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}

{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }

参见:http://www.cnblogs.com/wangjing666/p/6845294.html

最新文章

  1. ECharts2.2.0 兼容IE8
  2. java基础回顾(五)——Stack、Heap
  3. spring3+struts2+hibernate3整合出现的问题,No mapping found for dependency [type=java.lang.String, name='struts.objectFactory.spring.enableAopSupport']
  4. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)
  5. KnockOut绑定
  6. https时代来了,你却还一无所知?
  7. Linux 查硬件配置
  8. ABP入门系列(13)——Redis缓存用起来
  9. C++对象模型(二):The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为)
  10. Java堆和优先队列
  11. 使用Github生成燃尽图
  12. 【BZOJ5499】[2019省队联测]春节十二响(贪心)
  13. TreeMap中文排序,TreeMap倒序输出排列
  14. 关于 early Z 与 z-prepass
  15. java 新创建的类要重写的方法
  16. MySql数据库备份的几种方式
  17. Struts2与Servlet之间的关系
  18. 【Linux】GDB程序调试
  19. iOS-登录发送验证码时60秒倒计时,直接用
  20. Codeforces Round #520 (Div. 2) D. Fun with Integers

热门文章

  1. springboot2整合logback.xml动态修改日志打印级别
  2. java通配符写法
  3. C# 与 C++,语法差别有多小-第二章 C++浏览
  4. Solr JAVA客户端SolrJ的使用
  5. http请求方法,get 对比 post
  6. ACM2014-04训练计划
  7. 用PHP实现一些常见的排序算法
  8. P1582倒水
  9. flutter输入颜色枚举卡顿假死
  10. cmath模块——复数域数学函数模块