根据mongodb官方文档介绍,如果在插入(insert)操作时,没有指定主键id,那么它会自动给插入行自动附上一个主键id。看起来不错,但是详细看看,就会发现这个id值有点复杂。

如下图:

mongdb把这个id称为ObjectId

所以,如果我们想创建跟mysql的那种自动递增的主键,应该怎么操作呢?

如下图,就是我们想实现的效果图:

创建自动递增主键

利用mogodb命令行

        /*part 1: 创建计数器表*/
db.counters.insert({_id: "userid", seq: 0}) /*part 2: 创建一个javascript函数
* from: http://www.runoob.com/mongodb/mongodb-intro.html
* MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
* */
function getNext(name) {
var ret = db.counters.findAndModify({
query: {_id: name},
update: {$inc: {seq: 1}},
new: true,
upsert: true
});
return ret.seq;
};
/**
* part 3: 从计数器中分配一个主键id,然后插入一条记录到users表
*/
db.users.insert({_id: getNext("userid"), name: "hello world"})

利用php去实现

 <?php
$dsn = "mongodb://127.0.0.1:27017";
$mongo = new MongoClient($dsn); $db = $mongo->selectDB("test"); //执行mongo命令,并调用JavaScript函数。从counters表中分配一个users表的主键id
$ret = $db->command(array(
'findAndModify' => 'counters',
'query' => array('_id' => 'userid'),
'update' => array('$inc' => array('seq' => 1)),
'new' => true,
)); //插入一条记录到users表
$id = $ret['value']['seq'];
$ret = $db->selectCollection('users')->insert(array(
'_id' => $id,
'name' => 'jason'
));//

注意

1. mongodb对单文档的操作具有原子性,对多文档的操作不具有原子性,所以通过findAndModify进行+1(incr 1)的操作是安全的。

2. 从函数的角度来看,findAndModify比update更为强大,你看看它可以传递的参数个数就知道了。而在上面之所以选择findAndModify是因为这个函数可以返回操作后或者操作前整个document(相当于数据库的一行)的值。

相关知识点

1. findAndModify的相关用法

2. php的MongoClient、MongoColletion、MongoDB类需要看看手册了

mongdb创建自增主键(primary key)的相关讨论 - Jason.Zhi的更多相关文章

  1. 关于主键(PRIMARY KEY)和自增(AUTO_INCREMENT)结合使用的知识点

    1.主键(PRIMARY KEY)和自增(AUTO_INCREMENT)同时使用两种写法:    a.主键(PRIMARY KEY)和自增(AUTO_INCREMENT)分两行写        创建一 ...

  2. sqlite3创建自增主键,以及清空表使自增列归零

    1.创建自增主键 CREATE TABLE tb_python (ID INTEGER PRIMARY KEY AUTOINCREMENT,TITLE TEXT,URL TEXT); 2.清空表 SQ ...

  3. 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)

    1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...

  4. Oracle主键(Primary Key)使用详细的说明

    Oracle/PLSQL: 主键(Primary Key)说明 1 目标 通过演示样例解说怎样创建.删除.禁用和开启主键. 2 前言之-什么是主键 在Oracle中,主键指能唯一标识一条记录的单个数据 ...

  5. 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK

    如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...

  6. oracle 创建自增主键

    1.创建表 create table Test_Increase( userid number(10) NOT NULL primary key, /*主键,自动增加*/ username varch ...

  7. Oracle创建自增主键表

    1.创建表 /*第一步:创建表格*/ create table t_user( id int primary key, --主键,自增长 username varchar(), password va ...

  8. 主键primary key和唯一索引unique index

    1)主键一定是唯一性索引,唯一性索引并不一定就是主键. 2)主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引. 3)主键常常与外键构成参照完整性约束,防止出现数 ...

  9. SQLSERVER聚集索引和主键(Primary Key)的误区认识

    引用别人的,供以后学习使用,谢谢! 很多人会把Primary Key和聚集索引搞混起来,或者认为这是同一个东西.这个概念是非常错误的. 主键是一个约束(constraint),他依附在一个索引上,这个 ...

随机推荐

  1. Python 优雅的操作字典【转】

    Python 中的字典是Python中一个键值映射的数据结构,下面介绍一下如何优雅的操作字典. 1.1 创建字典 Python有两种方法可以创建字典,第一种是使用花括号,另一种是使用内建 函数dict ...

  2. selenium如何做兼容性测试呢

    selenium如何做兼容性测试呢. 现在selenium做自动化测试基本是web driver操作浏览器做操作,code中assert关键值,做判断. 具体执行2种 1.使用htmluint 来执行 ...

  3. NDK(0)简介

    AndroidNDK Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”. 众所周知,Android程序运行 ...

  4. Mtk Android 打包解包*.img

    打包/解包 boot.img, system.img, userdata.img, or recovery.img [DESCRIPTION] MTK codebase编译出来的image必须使用MT ...

  5. 【转】Android之内存泄漏调试学习与总结

    大家有或经常碰到OOM的问题,对吧?很多这样的问题只要一出现相信大家的想法跟小马的一样,就是自己的应用:优化.优化.再优化!而且如果出现类似于OOM这样级别的问题,根本就不好处理,LogCat日志中显 ...

  6. Android开源库--Asynchronous Http Client异步http客户端

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上. github地址:https://github.com/loopj/android-async-http Api文档地址:http://loop ...

  7. open_binary_frm

    参数uchar* head 是已经分配好内存的64个字节的地址 http://mysql.taobao.org/monthly/2015/08/07/ /** *先从.frm文件读取64字节 *第28 ...

  8. 打印机C++

    m_prnDC.SetMapMode(MM_LOMETRIC);  m_iPrnX = m_prnDC.GetDeviceCaps(HORZRES);m_iPrnY = m_prnDC.GetDevi ...

  9. NTP时间服务器配置与解析

    NTP时间服务器配置与解析 Edit By ZhenXing_Yu 目 录 编译安装ntp server 2 修改ntp.conf配置文件 2 配置时间同步客户机 2 在服务端验证: 3 在客户端进行 ...

  10. php 正则中的"i,m,s,x,e"分别表示什么

    i如果设定此修正符,模式中的字符将同时匹配大小写字母.m当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前.s如果设定了此修正符,模式中的圆点元 ...