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. DELPHI FMX 同时使用LONGTAP和TAP

    在应用到管理图标时,如长按显示删除标志,单击取消删除标志.在FMX的手势管理中,只有长按LONGTAP,点击TAP则是单独的事件,不能在同事件中管理.在执行LONGTAP后,TAP也会被触发​,解决方 ...

  2. Selenium-ActionChainsApi介绍

    ActionChains 模拟鼠标悬浮到某一个位置,做一系列的连贯操作,使用Selenium提供的ActionChains模块 引入方式 from selenium.webdriver.common. ...

  3. 【GMOJ6377】幽曲[埋骨于弘川]

    Description \(n\in[1,500],k\in[2,10]\). Solution 这是一道有点很有难度的题. 先考虑判断一个数是否在数列\(a\)中.由于每次加的数是在\([0,k)\ ...

  4. MyBatis 中的#和$的区别

    #相当于对数据 加上 双引号,$相当于直接显示数据 #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的 ...

  5. AGC040

    AGC040 A 模拟. B 因为顺序无关紧要,所以可以先把区间按右端点排序方便处理. 设第一个区间在\(A\)集合,考虑枚举第一个在\(B\)集合的区间\(i\),这样两个集合的右端点\(\min\ ...

  6. (转)pd.read_csv之OSError: Initializing from file failed的解决方案

    转:https://blog.csdn.net/funnyPython/article/details/78532102 rides = pd.read_csv(data_path)1 # OSErr ...

  7. 1208D Restore Permutation

    题目大意 给你一个序列s 让你求一个1~n的序列 使得对于第i个位置它前面所有小于p[i]的数的和恰好为s[i] 分析 我们可以从后往前确定每一位 每次一二分找到恰好等于s[i]的数 但是我们发现这样 ...

  8. C#-概念-接口:接口

    ylbtech-C#-概念-接口:接口 接口(硬件类接口)是指同一计算机不同功能层之间的通信规则称为接口. 接口(软件类接口)是指对协定进行定义的引用类型.其他类型实现接口,以保证它们支持某些操作.接 ...

  9. 使用 Select2 下拉框实现复选

    使用 Select2 下拉框实现复选 <!DOCTYPE html> <html> <head> <meta http-equiv="Content ...

  10. 【转】时间序列分析——基于R,王燕

    <时间序列分析——基于R>王燕,读书笔记 笔记: 一.检验: 1.平稳性检验: 图检验方法:     时序图检验:该序列有明显的趋势性或周期性,则不是平稳序列     自相关图检验:(ac ...