MongoDB基础命令及语法

1、文档:是MongdoDB中数据的基本单元,多个键及关联的值有序的放置在一起便是文档。类似关系数据库管理系统中的“行”。
2、集合:就是一组文档。类型关系数据库的“表”。
3、数据库:MongoDB中多个文档组成集合,同样多个集合可以组成“数据库”。
MongoDB不但区分类型,也区分大小写,文档中键/值对是有序的,MongoDB的文档不能有重复的键。
2.2.2命名
子集合:“组织”集合的一种惯例是使用“.”字符分开的按“命名空间”划分的“子集合”。
例句:
    blog           集合
    blog.posts     子集合
    blog.authors   子集合
blog集合与其子集合blog.posts、blog.authors没有任何关系。


2.5.2  MongoDB客户端  语法糖
1、列出当前“数据库”
> show dbs
2、列出当前所有集合,即所有的“表”
> show collections
3、列出数据库服务器的状态
> db.serverStatus()
4、列出指定数据库包含的集合名称列表
> db.getCollectionNames()
5、删除数据库
> db.dropDatebase()
6、创建集合
> db.myColl.save({})  myColl为集合名称
7、删除集合
> db.myColl.drop()    myColl为集合名称
8、选择要使用的数据库
> use foobar
建立新的数据库
> use myfirstdb
提示:switched to db myfirstdb
> db.users.save({"username":"aaa"}) 定义一个collection,名为“users”,然后插入数据
> show dbs
可以看到新数据库了


2.5.3   shell中的基本操作(P31页)
在shell查看操作数据会用到4个基本操作:创建、读取、更新、删除(CRUD)。
1、insert():插入数据;
   例句1:insert添加一个文档到集合里面
   1.创建局部变量post,这个是MongoDB的文档
    > post={"title":"aaa","content":"bbb","date":new Date()}
   2.用insert()将其保存到blog集合中
    > db.blog.insert(post)
   例句2:
    > db.test.insert({"a":1,"aname":"king"})
   例句3:循环插入
    for(var i=0;i<=10;i++)db.test.insert({"b":i,"cname":"King"+i})
2、find():会返回集合里面所有的文档;(P65)
3、findOne():查看某一个文档;
4、update():修改
5、remove():删除
   > db.user.remove("键":"值")


2.6数据类型
2.6.1 基本数据类型
仅包含6种数据类型:
null:空值或者不存在的字段;{"x":null}
布尔:布尔类型有两个值'true','false';{"x":true}
数字:64位浮点数{"x":3.14}  {"x":3}
字符串:UTF-8字符串{"x":"foobar"}
数组:{"x":["a","b","c","d"]}
对象:
对象id:对象id是文档的12字节的唯一ID。想见2.6.6;{"x":ObjectId()}
日期:日期类型存储的是从标准纪元开始的毫秒数。不存储时区;{"x":new Date()}


三、第三章
3.1
for i in range(10000)
    collection.insert({"foo":"bar","baz":i,"z":10-i})


四、第四章
4.2 查询条件
4.2.1查询条件
$lt:小于符号“<”
$lte:小于等于符号“<=”
$gt:大于符号“>”
$gte:大于等于符号“>=”
$ne:不等于“!=”
例句:
> db.users.find({"age":{"$gte":18,"lte":30}})
> db.users.find({"username":{"$ne":"joe"}})


4.2.2  OR查询
$in:一个键的多个值
$nin:取反
$or:多个键值的任意给定值
例句:
> db.raffle.find({"ticket_no":{"$in":[725,542,390]}})
> db.raffle.find({"ticket_no":{"$in":[12345,"joe"]}})
> db.raffle.find({"ticket_no":{"$nin":[725,542,390]}})
> db.raffle.find({"$or":[{"ticket_no":725},{"winner":true}]})


4.2.3
$not:元条件句,即可以用在任何其他条件之上。
$mod:取模运算法


例句:
$mod查询的值除以第一个给定值,若余数等于第二个给定值则返回改结果
> db.users.find({"id_num":{"$mod":[5,1]}})
  会返回1、6、11、16,单要是想返回2、3、4、5、7、8、9、10、12就要用$not
> db.users.find({"id_num":{"$not":{"$mod":[5,1]}}})


4.3.2 正则表达式
4.3.3 查询数组
$all:通过多个元素匹配数组  P71
$size:查询数组,查询指定长度的数组
> db.food.find({"fruit":{"$size":3}})


$slice:返回数组的一个子集合
返回前10条信息
    > db.blog.posts.findOne(criteria,{"comments":{"$slice":10}})
返回后10条信息
    > db.blog.posts.findOne(criteria,{"comments":{"$slice":-10}})
返回中间的结果,返回第24-33个元素
    > db.blog.posts.findOne(criteria,{"comments":{"$slice":[23,10]}})
返回最后1条信息
    > db.blog.posts.findOne(criteria,{"comments":{"$slice":-1}})


4.4 $where查询
> db.foo.find({"$where":function(){
    for(var current in this){
        for(var other in this){
           if(current != other && this[current] == this[other]){
     return true;
           }
        }
    }
    return false;
    }});


4.5游标
4.5.1 limit、skip和sort
只返回3个结果
> db.c.find().limit(3)
略过前3个文档,返回余下的文档
> db.c.find().skip(3)
sort排序:1升序,-1降序
> db.c.find().sort({username:1,age:-1})
分页非常实用,想搜索mp3,每页返回50个结果,按照价格从高到低排序
> db.stock.find({"desc":"mp3"})limit(50).sort({"price":-1})
点击“下一页”,通过skip实现,只需要略过前50个结果就好
> db.stock.find({"desc":"mp3"})limit(50).skip(50).sort({"price":-1})
注意:略过更多的结果会导致性能问题,建议尽量避免。


4.5.3 高级查询
$maxscan:integer  P80
$min      :  document
$max      :  document
$hint     :  document
$explain  :  boolean
$snapshot :  boolean


第七章
7.3.1GridFS存储文件
mongofiles的3个基本操作:put、list、get
put:将文件系统中的一个文件添加到GridFS中。
list:把所有添加到GridFS中的文件列出来。
get:是put的逆操作,它将GridFS中的文件写入到文件系统中。


mongofiles的另外2个操作:search、delete
search:按文件名查找GridFS中的文件。
delete:从GridFS中删除一个文件。


GridFS定义键
_id:文件唯一的id,在块中作为“files_id”键的值存储
length:文件内容总的字节数
chunkSize:每块的大小,以字节为单位。默认是256k,必要时可以调整。
uploadDate:文件存入GridFS的时间戳。
md5:文件内容的md5校验和,由服务器端生成。


第八章
8.3.2  认证工作原理
> mongod.exe  --dbpath c:\mongodb\data\db --auth  (启动服务器时选择用户验证模式)
数据库的用户账号以“文档”的形式存储在system.users“集合”里面。文档结构是:
{"user":username,"readOnly":true,"pwd":password hash}


1、添加用户
> use test
> db.addUser("root","abcd")      --> db.addUser("用户名","密码")                只读权限
> db.addUser("root","abcd",true) --> db.addUser("用户名","密码","readOnly属性") 相应数据库的写权限
2、删除用户
> db.system.users.remove({"user":"test_user"})
3、auth命令行选项,开启安全检查
   数据库认证用户登陆
> db.auth("root","abcd")


第九章 复制
主从复制
--master主服务器  --slave从服务器
1、建立主节点数据目录,并绑定端口(10000)
   > mongod.exe  --dbpath  c:\mongodb\data\db  --port  10000  --master 
2、建立从节点数据目录,要选择不同的目录和端口,并且用--source为从节点指明主节点地址
   > mongod.exe  --dbpath  d:\mongodb\data\db  --port  10001  --slave  --source  localhost:10000
所有从节点都从主节点复制内容。目前不能从从节点复制。原因是从节点并不保存自己的oplog。不超过12个从节点运转良好


--only:在“从节点”上指定值复制特定某个数据库
--slavedelay:用在“从节点”上,当应用主节点的操作时增加延时(单位是秒)。
--fastsync:以主节点的数据快照为基础启动从节点。
--autoresync:如果从节点与主节点不同了,则自动重新同步。
--oplogSize:主节点oplog的大小(单位是MB)
--source:启动从节点时,指定到的主节点位置
--添加删除源,更改从节点配置,改用prod.example.com为源
  > db.source.insert({"host":"prod.example.com:27017"})
  > db.source.remove({"host":"localhost:27017"})
副本集:自动故障恢复功能的主从集群。主从集群和副本集最为明显的区别是副本集没有固定的“主节点”:真个集群会选出一个“主节点”
当其不能工作时则变更到其他节点。
--replSet:让服务器知晓在某个副本集中,比如blort还有别的同伴
> mongod.exe  --dbpath  c:\mongodb\data\db1  --port  10001  --replSet  blort/morton:10002
同样方式启动另一台
> mongod.exe  --dbpath  d:\mongodb\data\db2  --port  10002  --replSet  blort/morton:10001
添加第三台
> mongod.exe  --dbpath  e:\mongodb\data\db3  --port  10003  --replSet  blort/morton:10001
或者
> mongod.exe  --dbpath  e:\mongodb\data\db3  --port  10003  --replSet  blort/morton:10001,morton:10002
9.2.2 副本集中节点
standard
这种是常规节点,它存储一份完整的数据副本,参与选举投票,有可能成为活跃节点。
passive
存储了完整的数据副本,参与投票,不能成为活跃节点。
arbiter
仲裁者只参与投票,不接收复制的数据,也不能成为活跃节点。
标准节点和被动节点之间的区别仅仅就是数量的差别:每个参与节点(非仲裁者)有个优先权。优先权为0则是被动的,不能成为活跃
节点。优先值不为0,则按照由大到小选出活跃节点,优先值一样的话则看谁的数据比较新。


9.4  复制工作原理
MongoDB的复制至少需要两个服务器或者节点。其中一个是主节点,负责处理客户端请求,其他都是从节点,负责映射主节点的数据。主节
点记录在其上执行的所有操作。从节点定期轮询主节点获得这些操作,然后对自己的数据副本执行这些操作。由于和主节点执行了相同的操
作,从节点就能保持与主节点数据同步。


9.4.1 oplog
主节点的操作记录称为oplog。oplog存储在一个特殊的数据库中,叫做local。oplog就在其中的oplog.$main集合里面。oplog中的每个文档
都代表主节点上执行的一个操作
ts:操作时间戳,用于跟踪操作执行的时间。由4字节的时间戳和4字节的递增计数器构成。
op:操作类型,只有1字节代表。
ns:执行操作的命名空间。
o:进一步指定要执行 的操作的文档。


随机数
Math.radnom()


疑问符号
> db.version:返回正在运行的MongoDB服务器的版本
$exists   P70
$each




修改器
$set:用来指定一个键的值。如果这个键不存在,则创建它。对更新模式和增加用户定义键非常方便。
      可以修改键的类型。
$unset:将“键”完全删除
$inc:增加已有键的值,或者在键不存在时创建一个键。分析数据、因果关系、投票使用这个会非常方便。(只能使用数字)
save:是一个函数,在文档不存在时插入,存在时更新。
      > var x = db.foo.findOne()
      > x.num=42
      42
      > db.foo.save(x)  很方便
      > db.foo.update({"_id":x._id},x)   很罗嗦
findAndModify:有点慢,这是因为要等待数据库的响应
findAndModify命令中每个键对应的值:
findAndModify:字符串,集合名
query:查询文档,用来检索文档的条件
sort:排序结果条件
update:修改器文档,对所找到的文档执行的更新
remove:布尔类型,表示是否删除文档
new:布尔类型,表示返回的是更新前的文档还是更新后的文档。默认是更新前的文档
"update"和"remove"必须有一个,也只能有一个,一次只能处理一个文档,也不能执行upsert操作




数组修改器
$push:向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。(不能用在整数)
$ne:一个值不在数组里就把它加进去。
$addToSet:添加,避免重复(添加时,避免数据重复)
        db.users.update( 
         {"userName":"refactor"},
         {
           "$addToSet":
            {
                 "emails":"295240648@qq.com"
            }
         }
           )
$pop:把数组看成队列和栈,可以从数组任何一端删除元素(不能用在字符串)
      {$pop:{key:1}}从数组末尾删除一个元素
      {$pop:{key:-1}}从数组头部删除一个元素
$pull:可以根据特定条件删除元素,也可以根据位置删除元素
       > db.lists.update({},{"$pull":{"todo":"laundry"}})  删掉"todo"键里边值为"laundry"数据
       db.users.update(
         {"userName":"refactor"},
         {
           "$pull":
           {
              "emails":"295240648@111.com"
           }
         }
           )
       $pull会将所有匹配的部分删掉。对数组[1,1,1,1,2,1]执行"pull" 1,得到的结果只有一个元素的数组[2]




MongoDB监控插件
例如:Nagios、Munin、Ganglia、Cacti






http://blog.csdn.net/shirdrn/article/details/7105539
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值