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 台节点的环境 ...
随机推荐
- hibernate操作数据库时报错解决方式
java.sql.SQLException: Parameter index out of range (28 > number of parameters, which is 27). 这个说 ...
- 初识ansible
一 . 初识ansible 1 . 准备工作: 准备四台干净的虚拟机, 192.168.133.129(主控节点,下面三个为被控节点) 192.168.133.130 192.168.133.131 ...
- Android屏幕录制
自己实现了Android的屏幕录制App. 用了MediaProjection类来作为源,MediaRecoder来捕捉,编码转换为本地视频. 效果图: 主要是这段代码开始录像: startActiv ...
- 1、redis安装与启动
1.安装包下载 官网上下载:http://www.redis.io/ 安装版本:3.0.7 安装环境:CentOS 下载命令:wget http://download.redis.io/release ...
- MyBatis 体系结构
- Spark性能优化的10大问题及其解决方案
Spark性能优化的10大问题及其解决方案 问题1:reduce task数目不合适 解决方式: 需根据实际情况调节默认配置,调整方式是修改参数spark.default.parallelism.通常 ...
- Java-汉字繁体拼音转换
import com.github.stuxuhai.jpinyin.ChineseHelper; import com.github.stuxuhai.jpinyin.PinyinFormat; i ...
- jQuery开发者眼中的AngularJS
文章来源:http://blog.jobbole.com/76265/ AngualrJS是一个很贴心的web应用框架.它有很不错的官方文档和示例:经过在现实环境中的测试著名的TodoMVC proj ...
- Visula Studio 2013 初始化静态浮点型数据在C++类内
class MyClass { private: static const int intvalue= 50; static const float floatvalue = 0.07f; }; 如上 ...
- Openssl s_client命令
一.简介 s_client为一个SSL/TLS客户端程序,与s_server对应,它不仅能与s_server进行通信,也能与任何使用ssl协议的其他服务程序进行通信 二.语法 openssl s_cl ...