mongdb创建自增主键(primary key)的相关讨论 - Jason.Zhi
根据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(相当于数据库的一行)的值。
相关知识点
2. php的MongoClient、MongoColletion、MongoDB类需要看看手册了
mongdb创建自增主键(primary key)的相关讨论 - Jason.Zhi的更多相关文章
- 关于主键(PRIMARY KEY)和自增(AUTO_INCREMENT)结合使用的知识点
1.主键(PRIMARY KEY)和自增(AUTO_INCREMENT)同时使用两种写法: a.主键(PRIMARY KEY)和自增(AUTO_INCREMENT)分两行写 创建一 ...
- sqlite3创建自增主键,以及清空表使自增列归零
1.创建自增主键 CREATE TABLE tb_python (ID INTEGER PRIMARY KEY AUTOINCREMENT,TITLE TEXT,URL TEXT); 2.清空表 SQ ...
- 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...
- Oracle主键(Primary Key)使用详细的说明
Oracle/PLSQL: 主键(Primary Key)说明 1 目标 通过演示样例解说怎样创建.删除.禁用和开启主键. 2 前言之-什么是主键 在Oracle中,主键指能唯一标识一条记录的单个数据 ...
- 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK
如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...
- oracle 创建自增主键
1.创建表 create table Test_Increase( userid number(10) NOT NULL primary key, /*主键,自动增加*/ username varch ...
- Oracle创建自增主键表
1.创建表 /*第一步:创建表格*/ create table t_user( id int primary key, --主键,自增长 username varchar(), password va ...
- 主键primary key和唯一索引unique index
1)主键一定是唯一性索引,唯一性索引并不一定就是主键. 2)主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引. 3)主键常常与外键构成参照完整性约束,防止出现数 ...
- SQLSERVER聚集索引和主键(Primary Key)的误区认识
引用别人的,供以后学习使用,谢谢! 很多人会把Primary Key和聚集索引搞混起来,或者认为这是同一个东西.这个概念是非常错误的. 主键是一个约束(constraint),他依附在一个索引上,这个 ...
随机推荐
- poj-2236 Wireless Network &&poj-1611 The Suspects && poj-2524 Ubiquitous Religions (基础并查集)
http://poj.org/problem?id=2236 由于发生了地震,有关组织组把一圈电脑一个无线网,但是由于余震的破坏,所有的电脑都被损坏,随着电脑一个个被修好,无线网也逐步恢复工作,但是由 ...
- poj -1065 Wooden Sticks (贪心or dp)
http://poj.org/problem?id=1065 题意比较简单,有n跟木棍,事先知道每根木棍的长度和宽度,这些木棍需要送去加工,第一根木棍需要一分钟的生产时间,如果当前木棍的长度跟宽度 都 ...
- java 名词解释等
类 实例 引用 实质指针 封装 for 的不同形式 for (int i : Location) 集合类 ArrayList<Egg> = new ArrayList<Egg> ...
- 1430. Crime and Punishment(枚举)
1430 即使是枚举 也是有一定技术含量的 对于ax+by = n: 枚举max(a,b)中的系数 这样可以确定另一个 但问题是如何确定上限 假设max(a,b) = a,很显然是不会超n/a的 但这 ...
- linq to sql ,将var 类型转为 IList 类型
public void SOHSelecting(int startRowIndex, int maximumRows, string sortExpression, string location) ...
- UVa 11636 (注意读题) Hello World!
这道题巨坑啊,样例中以-1结束输入的,所以我就天真的以为测试数据也是以-1结束输入的 其实人家原文中说: Input is terminated by a line containing a nega ...
- 51nod1189 阶乘分数
(x-n!)(y-n!)=n!2 ans=t[n]+1.t表示的是n!2的小于n!的约数个数.n!2=p1a1*p2a2*p3a3...t[n]=(a1+1)*(a2+1)...-1 /2; 2对于n ...
- HDU 1372 Knight Moves【BFS】
题意:给出8*8的棋盘,给出起点和终点,问最少走几步到达终点. 因为骑士的走法和马的走法是一样的,走日字形(四个象限的横竖的日字形) 另外字母转换成坐标的时候仔细一点(因为这个WA了两次---@_@) ...
- Vim实现批量注释的方法
调试代码的时候,免不了要批量注释/取消代码注释,很多IDE都有快捷键将你选中的代码块批量注释/取消注释的功能,那么在Vim里面如何完成这个功能呢? 方法一 块选择模式 批量注释: Ctrl + v 进 ...
- MVC+Ef项目(1) 项目的框架搭建
一:首先我们来搭建最基本的项目框架,这里使用MVC3作为web项目,然后我们添加几个类库项目 最后的项目如下, 其中有一个 YouJiao.MvcWeb.Repository 实际就当做是 DAL层即 ...