根据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. PostgreSQL的创建表

    PostgreSQL的CREATE TABLE语句是用来在任何指定的的数据库中创建一个新表. 语法 CREATE TABLE语句的基本语法如下: CREATE TABLE table_name( co ...

  2. BZOJ 1041 圆上的整点

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1041 题意:求圆x^2+y^2=r^2上的整点. 思路:由于对称性,我们只需要计算第一象 ...

  3. 第十篇 PO核心功能及流程详解

    详见链接:http://bbs.erp100.com/thread-272866-1-1.html1. P2P lifecycleP2P是procure to pay的缩写,p2p循环值得就是采购到付 ...

  4. leetcode:Search for a Range(数组,二分查找)

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  5. how to check unsolved conflicts file list in git merge?

    how to check unsolved conflicts file list in git merge?

  6. Qt环境搭建(Qt Creator)

    简述 上一节中介绍了如何进行Qt和Visual Studio的下载安装,随后演示了如何将Qt集成到Visual Studio中,并完成了我们第一个Qt小程序-Hello World.下面主要讲解如何利 ...

  7. [转载]initwithcoder和 initwithframe

    大前提是UIViewController有一个UIView.同时,需要厘清两个概念,创建一个类和实例化一个类.在XCode中创建一个类和实例化一个类很容易区分,但是在IB(Interface Buil ...

  8. Spark快速入门(1)

    1 安装Spark 首先,到 https://spark.apache.org/downloads.html 选择最新的 Spark 版本和 Hadoop 版本(实际上我们暂时用不上 Hadoop,所 ...

  9. T-SQL备忘(5):查看执行计划

    先理解几个概念:表扫描.聚集索引扫描.聚集索引查找.索引扫描.书签查找. [查看执行计划] 在理解概念之前先得知道如何查看执行计划—Ctrl+L.如下图: 注:SQL Server的执行计划是从右向左 ...

  10. HDU 4662 MU Puzzle 2013 Multi-University Training Contest 6

    现在有一个字符串"MI",这个字符串可以遵循以下规则进行转换: 1.Mx 可以转换成 Mxx ,即 M 之后的所有字符全部复制一遍(MUI –> MUIUI) 2.III 可 ...