mongodb中的ObjectId类型主键
2016-04-21 15:44
573 查看
mongodb中存储的文档必须有一个_id键,这个键的值可以是任意类型的,默认是一个ObjectId对象,在一个集合里面,每一个文档都有唯一的_id值,来确保集合里面的每个文档都能被唯一标识,但是在不同的集合中,可以有两个相同的_id值
ObjectId使用12字节的存储空间,每一个字节是两位十六进制的数字,是一个24位的字符串,该12字节按照如下方式生成
0 1 2 3 时间戳
4 5 6 机器Machine
7 8 PID
9 10 11 计数器
解释:
1、前4个字节(即前八位字符串)是一个UNIX时间戳,精确到秒,实际上隐藏了文档创建的时间(将其换算成十进制,再格式化一下即可发现)
2、接下来的3个字节,是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器hash值,在分布式中不造成冲突,这也就是在同一台机器生成的ObjectId中间的字符串都是一模一样的原因
3、这两个字节PID是为了在同一台机器不同的mongodb进程产生的ObjectId不冲突,即进程标识符
4、前面的字节保证了一秒内不同机器不同进程生成的ObjectId不冲突,最后3个字节,是一个自动增加的计数器,用来确保在同一秒内产生的ObjectId也不会发生冲突
在一个博客项目中,需要通过该_id查询对应的文章信息,在查询语句时,不能直接使用{'_id' : id}这种形式,因为_id是一个ObjectId类型,而你传入的id只是一个字符串,会导致错误,因此,使用{'_id' : ObjectId(id)}这种方式传入字符串id进行查询,当然,需要在之前引入ObjectId()该方法,即var ObjectId = require('mongodb').ObjectId;
var ObjectId = require('mongodb').ObjectId;
Post.getOne = function(name, day, title, id, callback){
mongodb.open(function(err, db){
if(err){
return callback(err);
}
db.collection('posts',function(err, collection){
if(err){
mongodb.close();
return callback(err);
}
//查询
collection.findOne({
'name' : name,
'time.day' : day,
'title' : title,
'_id' : ObjectId(id)
},function(err, doc){
mongodb.close();
if(err){
return callback(err);
}
//解析markdown为html
//doc.post = markdown.toHTML(doc.post);
callback(null, doc);
})
})
})
}参考链接:
http://blog.csdn.net/xiamizy/article/details/41521025
ObjectId使用12字节的存储空间,每一个字节是两位十六进制的数字,是一个24位的字符串,该12字节按照如下方式生成
0 1 2 3 时间戳
4 5 6 机器Machine
7 8 PID
9 10 11 计数器
解释:
1、前4个字节(即前八位字符串)是一个UNIX时间戳,精确到秒,实际上隐藏了文档创建的时间(将其换算成十进制,再格式化一下即可发现)
2、接下来的3个字节,是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器hash值,在分布式中不造成冲突,这也就是在同一台机器生成的ObjectId中间的字符串都是一模一样的原因
3、这两个字节PID是为了在同一台机器不同的mongodb进程产生的ObjectId不冲突,即进程标识符
4、前面的字节保证了一秒内不同机器不同进程生成的ObjectId不冲突,最后3个字节,是一个自动增加的计数器,用来确保在同一秒内产生的ObjectId也不会发生冲突
在一个博客项目中,需要通过该_id查询对应的文章信息,在查询语句时,不能直接使用{'_id' : id}这种形式,因为_id是一个ObjectId类型,而你传入的id只是一个字符串,会导致错误,因此,使用{'_id' : ObjectId(id)}这种方式传入字符串id进行查询,当然,需要在之前引入ObjectId()该方法,即var ObjectId = require('mongodb').ObjectId;
var ObjectId = require('mongodb').ObjectId;
Post.getOne = function(name, day, title, id, callback){
mongodb.open(function(err, db){
if(err){
return callback(err);
}
db.collection('posts',function(err, collection){
if(err){
mongodb.close();
return callback(err);
}
//查询
collection.findOne({
'name' : name,
'time.day' : day,
'title' : title,
'_id' : ObjectId(id)
},function(err, doc){
mongodb.close();
if(err){
return callback(err);
}
//解析markdown为html
//doc.post = markdown.toHTML(doc.post);
callback(null, doc);
})
})
})
}参考链接:
http://blog.csdn.net/xiamizy/article/details/41521025
相关文章推荐
- Mongodb创建用户
- Mongodb创建用户
- mongodb chunk 大小设置
- MongoDB常用命令集
- springMVC操作mongoDB增删改查
- mongodb 1
- 验证mongodb副本集并实现自动切换primary~记录过程
- Node.js开发入门——MongoDB与Mongoose
- MongoDB 操作范例
- MongoDB与传统数据库的使用区别——批量插入与批量查询
- 对比MySQL,你究竟在什么时候更需要MongoDB
- 8天学通MongoDB——第八天 驱动实践
- 8天学通MongoDB——第七天 运维技术
- 8天学通MongoDB——第六天 分片技术
- 8天学通MongoDB——第五天 主从复制
- 8天学通MongoDB——第四天 索引操作
- 8天学通MongoDB——第三天 细说高级操作
- 8天学通MongoDB——第二天 细说增删查改
- 8天学通MongoDB——第一天 基础入门
- MySQL与MongoDB的操作对比,以及区别