MongoDB学习笔记
MongoDB是文档型数据库。
多个key与value有序的组合就是文档。
文档类似于关系型数据库的行。
文档中的key:
- 不能有\0,这个字符表示key结尾。
- .与$有特殊意义。
- “_”开头的key要被保留。
- key不能重复,大小写敏感。
集合就是一组文档,集合类似与关系型数据库的表。
在一个集合里面,每个文档都有唯一的“_id”。“_id”是ObjectId类型的。
“_id”服务端可以自动生成,但是由客户端生成效率更好。
多个集合组成数据库。
./mongod 用来启动服务
--fork参数可以以守护进程的方式启动
--objcheck 插入数据前检查文档结构的有效性
--noscripting完全禁止服务端JavaScript的执行
--nohttpinter-face 将http管理接口关闭
--bindip 指定运行允许访问的id
--repair 启动服务修复器
--slave 做为slave
--source 为从节点指明主的地址
./mongo 用来启动JavaScript - shell
> post = {"title" : "my blog title",
... "content" : "hello ",
... "date" : new Date()}
... "content" : "hello ",
... "date" : new Date()}
> db.blog.insert(post)
> db.blog.find()
> db.blog.find()
> db.blog.findOne()
> db.blog.update({title:"my blog tilte"}, post )
> db.blog.update({title:"my blog tilte"}, post ,true) //如果不存在则新建
> db.blog.update({title:"my blog tilte"}, post ,true,true) //对多个文档更新
> db.blog.remove({title:"my blog tilte"} )
//删除一个文档
> db.blog.remove() //删除所有文档,但是不会删除集合本身,原有索引也会保留。
> db.drop_collection("blog") ////删除所有文档,以及集合本身,包括索引,速度快。
db.集合名访问集合如果集合名恰巧是数据库类的一个属性会出现问题。例如db.version。
db.getCollection('version').find() 这样可以解决。
db.blog.update( {"title":"my blog title"} ,{"$inc": {"count":1 }}) //$inc 修改器
$set 指定修改哪个key,这个键不存在,则创建
$unset 这个键完全删除
$push 向已有数组末尾加入一个元素,没有则会创建数组
$ne 判断不等
$addToSet 添加时避免重复
打开一个shell就是一个数据库连接。每个连接的请求在一个队列中。
客户端驱动程序要保证一系列请求都由一个连接来处理。
查询条件: $lt $lte $gt $gte $ne $in $nin $or $mod $not $exists
>db.users.find({ "age" : { "$gte":18, "$lte" :30 } })
>db.users.find({ "id_num" : { "$mod" : [5,1 ] } }) //1,6,11,16
>db.users.find({ "id_num" : { "$not" : { "$mod" : [5,1 ] } } }) // 2,3,4,5,7,8,9,10
>db.c.find( { "z" : { "$in" : [null] , "$exists" : true } } )
支持正则表达式的查询(PCRE)
查询数组
$all 多个元素来匹配数组
$size 匹配数组长度
$slice 返回数组的一个子集合
$where 使用JS函数进行查询,速度慢
可以书用var cursor = find() 来做游标
cursor.forEach(function(x) {
print(x.name);
});
while (cursor.hasNext()) {
obj = cursor.next();
//do stuff
}
limit:限制数量
skip:略过前几个
sort:1升序-1降序
索引
db.people.ensureIndex({ “usr” : 1}) //跟usr建立索引,1是从小到大,-1从大到小
db.people.ensureIndex({ “usr” : 1}, {"name":"alphabet"} ) //可以给索引自定义名字
db.people.ensureIndex({ “usr” : 1}, {"unique":true} ) //唯一索引
db.people.ensureIndex({ “usr” : 1}, {"dropDups":true} ) //删除重复的
db.map.ensureIndex( { "gps" : "2d" } ) //为坐标平面查询:地理空间索引
count()获取数量
// distinct键获取不重复的
>db.runCommand( {"distinct" :"people", "key" : "age" } )
explain与hint两个查询的使用工具
db.foo.find().explain()
db.eval 锁住数据库,然后执行JavaScript脚本,再解释。
db.listCommands() 可以查询有哪些命令
可以创建固定集合,指定集合的总的容量或文档数量的上限。
GridFs是一种在MongoDB中存储大二进制文件的机制。
GridFs是建立在MongoDB文档基础上的轻量级文件存储规范。
安全的关闭方法:
- kill -2(sigint)
- kill (sigterm)
- db.shutdownServer()
addUser("root" , "kin") //增加DB用户 如果use admin db,则是增加管理员
mongodump 与 mongostore 备份与恢复
但是dump如果不停机的话,需要用fsync来锁定数据库,防止毁损数据。
主节点的操作记录叫做oplog。

浙公网安备 33010602011771号