MongoDB整理笔记のID自增长
以下是官网原文地址:
http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
概要
MongoDB 的_id字段作为一个主键存在于所有文档的最顶层,_id必须是唯一的,而且总是具有唯一约束的索引。除了唯一约束,你可以在集合中的_id字段上使用任何值,
以下这个指南描述了在_id上创建一个自增序列的两种方式:
Use Counter Collection
Optimistic Loop
注意事项
一般情况下,你不会愿意在_id字段,或任何字段上使用自增模式,那是因为不会有大量的文档构成的大规模数据库,通常情况下,更为理想的是默认_id。
实现过程
Use Counter Collection
Counter集合实现:
利用一个单独的计数器集合去跟踪我们使用的最后一个数字序列。该_id字段包含了序列名称和序列字段中该序列最后的值。
1、插入计数器集合,设置初始值为userid:
db.counters.insert(
{
_id: "userid",
seq: 0
}
)
2、创建一个getNextSequence函数,参数为序列的name,函数使用findandmodify()方法去自动增长序列的值并返回增长之后的结果:
function getNextSequence(name) {
var ret = db.counters.findAndModify(
{
query: { _id: name },
update: { $inc: { seq: 1 } },
new: true
}
);
return ret.seq;
}
3、在接下来插入数据的时候,使用getNextSequence这个函数:
db.users.insert(
{
_id: getNextSequence("userid"),//注意getNextSequence参数要与计数器集合中_id值一致
name: "Sarah C."
}
)
db.users.insert(
{
_id: getNextSequence("userid"),
name: "Bob D."
}
)
4、你可以试着查看结果:
db.users.find()
5、_id字段包含了自动增长序列的值:
{
_id : 1,
name : "Sarah C."
}
{
_id : 2,
name : "Bob D."
}
findandmodify这个方法包含了更新,查询字段并不是一定要有唯一索引,该方法可以在某些情况下多次插入同一个文档。例如,有多个客户端在使用同样查询条件时,都调用该方法,那么调用这些方法在执行更新操作之前必须先完成查询操作,而且这些方法能插入相同的文档。
在计数器事例中,查询字段是_id字段,它总是有一个独立的索引。我们再看如下示例:
function getNextSequence(name) {
var ret = db.counters.findAndModify(
{
query: { _id: name },
update: { $inc: { seq: 1 } },
new: true,
upsert: true
}
);
return ret.seq;
}
如果多个客户端在传入相同参数情况下来调用getNextSequence()方法,然后我们会发现以下其中一个行为将会发生:
一次findandmodify()方法将会成功插入一条文档;
0个或多个findandmodify()方法将会更新新插入的文件;
当它们试图插入重复的数据时,0个或多个findandmodify()方法;
如果由于违反了唯一约束而导致方法失败,请重试。
Optimistic Loop
略。
MongoDB整理笔记のID自增长的更多相关文章
- MongoDB整理笔记のCapped Collection
1.简单介绍 capped collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自 ...
- MongoDB整理笔记のjava MongoDB分页优化
最近项目在做网站用户数据新访客统计,数据存储在MongoDB中,统计的数据其实也并不是很大,1000W上下,但是公司只配给我4G内存的电脑,让我程序跑起来气喘吁吁...很是疲惫不堪. 最常见的问题莫过 ...
- MongoDB整理笔记のReplica Sets + Sharding
MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可靠.高可用还有些距离,所以有了"Replica Sets + Sharding" ...
- MongoDB整理笔记のMapReduce
MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Red ...
- MongoDB整理笔记のCRUD
添加 下面我们来建立一个test 的集合并写入一些数据.建立两个对象j 和t , 并保存到集合中去.在例子里 “>” 来表示是 shell 输入提示符 > j = { name : ...
- MongoDB整理笔记の体系架构
MongoDB 是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台特性. 一个运行着的MongoDB 数据库就可以看成是一个MongoDB Server,该Server 由实例和数 ...
- MongoDB整理笔记の新增Shard Server
1.启动一个新Shard Server 进程 [root@localhost ~]# mkdir /data/shard/s2 [root@localhost ~]# /Apps/mongo/bin/ ...
- MongoDB整理笔记のSharding分片
这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chu ...
- MongoDB整理笔记の增加节点
MongoDB Replica Sets 不仅提供高可用性的解决方案,它也同时提供负载均衡的解决方案,增减Replica Sets 节点在实际应用中非常普遍,例如当应用的读压力暴增时,3 台节点的环境 ...
随机推荐
- android在linux下刷机
只需要下载相应的zip包,不需装什么手机助手. 1.下载相应zip包(ROM) http://download.mokeedev.com/ 比如我在上述网站下的魔趣的对应机型的ROM包. 2.linu ...
- 汇编调用C程序
本程序用keil5实现. keil4会将C程序的地址设为0x00000000,即一开始就运行C程序了,参数都还没设置好.这个错误我也没深究,因为我自己装的是keil5. 首先需要在汇编代码中给C程序指 ...
- 有关Zedgraph的功能扩展的笔记
1.坐标轴范围.刻度调整后需要加上下面的语句才能刷新: zedGraphControl1.AxisChange(); zedGraphControl1.Refresh(); 2.坐标范 ...
- MySQL系统时间函数NOW(),CURRENT_TIMESTAMP(),SYSDATE()的区别
CURRENT_TIMESTAMP是NOW的同义词,也就是说两者是相同的. SYSDATE函数返回的是执行到当前函数时的时间,而NOW返回的是执行SQL语句时的时间. 测试语句: SELECT NOW ...
- 黑暗之光 Day1
1. 设置鼠标指针图标 Build Setting -> Player Setting 2. 添加雾的效果 Window->Lighting->Settings. 3. 任意键按下事 ...
- 封装baseservice
package com.huawei.base; import java.io.Serializable;import java.util.List; public abstract class Ba ...
- maven如何引入servlet-api和jsp-api
废话不多说,直接上代码 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax. ...
- Centos7安装jekyll
1.首先需要安装相应的依赖包及所需要的工具 sudo yum install nodejs npm ruby ruby-devel rubygems git 2.修改gem源 国内 使用的淘宝的更新源 ...
- HTML5新增的非主体结构元素
-------------------siwuxie095 HTML5 新增的非主体结构元素 1.header 元素 ...
- 【原】Mac下统计任意文件夹中代码行数的工
[链接][原]Mac下统计任意文件夹中代码行数的工http://www.cnblogs.com/wengzilin/p/4580646.html