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

mongodb 自增序列实现的更多相关文章

  1. MongoDB整理笔记のID自增长

    以下是官网原文地址: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/ 概要 MongoDB 的_i ...

  2. MongoDB学习-->设置通用的自增ID替代ObjectId

    插入mongodb数据时,会为其分配一个随机id,想要设置通用的自增id,可以进行以下操作 1.创建自增序列 package com.tangzhe.autoid; import lombok.Dat ...

  3. 【翻译】MongoDB指南/聚合——聚合管道

    [原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...

  4. 【翻译】MongoDB指南/CRUD操作(四)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...

  5. 【翻译】MongoDB指南/CRUD操作(三)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...

  6. 【翻译】MongoDB指南/CRUD操作(二)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...

  7. 【翻译】MongoDB指南/CRUD操作(一)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...

  8. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  9. MongoDB系列(二):C#应用

    前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...

随机推荐

  1. linux-Centos 7下bond与vlan技术的结合[推荐]

    https://blog.51cto.com/sf1314/2073519 服务器eth0与eth1作bonding,捆绑成bond0接口,服务器对端交换机端口,同属于100.101号vlan接口 v ...

  2. ubuntu18.04-安装最新cmake

    https://www.linuxidc.com/Linux/2018-09/154165.htm

  3. qt qsplashscreen 启动画面 延时

    intdelayTime=3; QElapsedTimer timer; timer.start(); while(timer.elapsed()<(delayTime*1000)) { app ...

  4. C# Label换行解决方法

    一.label太短,无法完成显示所要显示信息长度,要换行,解决方法如下: (1) string aa =(长串) ; string cc= aa.Substring(0,10);//取前10个字符 s ...

  5. ANTLR4加载csv数据

    实现功能: 编写一个自定义的监听器,将逗号分隔符文件(csv)中的数据加载到一种数据结构--“由Map组成的List”中. antlr4文件: grammar CSV; file : hdr row+ ...

  6. 129、TensorFlow计算图的可视化

    import tensorflow as tf # Build your graph x = tf.constant([[37.0, -23.0], [1.0, 4.0]], name="i ...

  7. 普通ACL访问控制列表

    配置OSPF R1: R2: R3: R4: 在R1上查看OSPF的学习 测试R1与R4环回接口连通性 配置普通ACL访问控制列表: 先在R4配置密码用R1与R4建立telnet建立 密码huawei ...

  8. JSP基础--EL表达式

    EL(表达式语言) 1 EL概述 1.1 EL的作用 JSP2.0要把html和css分离.要把html和javascript分离.要把Java脚本替换成标签.标签的好处是非Java人员都可以使用. ...

  9. Jmeter录制web和app脚本

    前置: 一.已经安装了jmeter 步骤: 一.打开jmeter,右键测试计划-->添加添加线程组-->线程-->线程组,新建线程组 二.右键线程组-->添加-->逻辑控 ...

  10. linux 查看 python 安装包路径

    [root]# python -c "import fasttext;print(fasttext)"<module 'fasttext' from '/root/anaco ...