1.查看当前数据库:show dbs
2.选择数据库:use databaseName
3.查看当前库的集合:show tables/collections
4.创建数据库:use databaseName
5.创建集合:db.createCollection('collectionName')/db.collectionName.insert({})
6.删除集合:db.collectionName.drop()
7.删除数据库:db.dropDatabase()
8.查询命令:db.help
9.新增文档:
db.collectionName.insert({"name":"zhangsan"})
db.collectionName.insert({"_id":1,"name": "lisi"})
10.删除文档:db.collectionName.remove(查询表达式, 选项);
选项是指 {justOne:true/false},是否只删一行, 默认为false
注意
1: 查询表达式依然是个json对象
2: 查询表达式匹配的行,将被删掉.
3: 如果不写查询表达式,collections中的所有文档将被删掉.
例1: db.stu.remove({sn:’001’});
删除stu表中 sn属性值为’001’的文档
例2: db.stu.remove({gender:’m’,true});
删除stu表中gender属性为m的文档,只删除1行.
11.修改文档:db.collectionName.update(查询表达式,新值,选项);
(1) db.news.update({name:'QQ'},{name:'MSN'});
是指选中news表中,name值为QQ的文档,并把其文档值改为{name:’MSN’},
结果: 文档中的其他列也不见了,改后只有_id和name列了.
即--新文档直接替换了旧文档,而不是修改
(2) 如果是想修改文档的某列,可以用$set关键字
db.collectionName.update(query,{$set:{name:’QQ’}})
修改时的赋值表达式:
$set:修改某列的值
$unset 删除某个列
$rename 重命名某个列
$inc 增长某个列
$setOnInsert 当upsert为true时,并且发生了insert操作时,可以补充的字段,相当于mysql中的列的默认值
例:db.user.update({name:'lisi'},{$set:{area:'chaoyang'},$unset:{height:1},$inc:{age:1},$rename:{sex:'gender'}});
(3) Option的作用:{upsert:true/false,multi:true/false}
Upsert---是指没有匹配的行,则直接插入该行.(和mysql中的replace一样)
例1:db.stu.update({name:'wuyong'},{$set:{name:'junshiwuyong'}},{upsert:true});
如果有name=’wuyong’的文档,将被修改
如果没有,将添加此新文档
例2:db.news.update({_id:99},{x:123,y:234},{upsert:true});
没有_id=99的文档被修改,因此直接插入该文档
(4) multi: 是指修改多行(即使查询表达式命中多行,默认也只改1行,如果想改多行,可以用此选项)
db.news.update({age:21},{$set:{age:22}},{multi:true});
则把news中所有age=21的文档,都修改
12.查询文档:db.collectionName.find(查询表达式,查询的列)
例1:db.stu.find()
查询所有文档 所有内容
例2: db.stu.find({},{gendre:1})
查询所有文档,的gender属性 (_id属性默认总是查出来)
例3: db.stu.find({},{gender:1, _id:0})
查询所有文档的gender属性,且不查询_id属性
例4: db.stu.find({gender:’male’},{name:1,_id:0});
查询所有gender属性值为male的文档中的name属性
13.查询表达式:
(1): 最简单的查询表达式
语法: {filed:value}
作用:是指查询field列的值为value的文档
(2): $ne
语法: {field:{$nq:value}}
作用:查filed列的值 不等于 value 的文档
(3): $nin
语法: {field:{$nin:value}}
作用:查filed列的值 不在 value数组的文档
(4): $all
语法: {field:{$all:[v1,v2..]}}
作用:是指取出 field列是一个数组,且至少包含 v1,v2值
(5): $exists
语法: {field:{$exists:1}}
作用: 查询出含有field字段的文档
(6): $nor
语法: {field:{$nor,[条件1,条件2]}}
作用:是指 所有条件都不满足的文档为真返回
(7):用正则表达式查询 以”诺基亚”开头的商品
语法: db.goods.find({goods_name:/诺基亚.*/},{goods_name:1});
(8): 用$where表达式来查询
语法: db.goods.find({$where:'this.cat_id != 3 && this.cat_id != 11'});
(9): $eq
语法:{field: {$eq,value}}
作用:是指满足field值等于value的文档返回
(10): $gt
语法:{field: {$gt,value}}
作用:是指满足field值大于value的文档返回
(11): $gte
语法:{field: {$gte,value}}
作用:是指满足field值大于等于value的文档返回
(12): $lt
语法:{field: {$lt,value}}
作用:是指满足field值小于value的文档返回
(13): $lte
语法:{field: {$lte,value}}
作用:是指满足field值小于等于value的文档返回
14.查看语句的执行计划
db.collectionName.find({"name":"123"}).explain();
15.索引
(1) 查看当前索引状态: db.collectionName.getIndexes();
(2) 创建普通的单列索引:db.collectionName.ensureIndex({field:1/-1}); 1是升续 -1是降续
(3) 删除单个索引:db.collectionName.dropIndex({filed:1/-1});
(4) 一下删除所有索引:db.collectionName.dropIndexes();
(5) 创建多列索引 :db.collectionName.ensureIndex({field1:1/-1, field2:1/-1});
(6) 创建子文档索引:db.collectionName.ensureIndex({filed.subfield:1/-1});
(7) 创建唯一索引:db.collectionName.ensureIndex({filed.subfield:1/-1}, {unique:true});
(8) 创建稀疏索引:如果针对field做索引,针对不含field列的文档,将不建立索引.
与之相对,普通索引,会把该文档的field列的值认为NULL,并建索引.
根据{email:null}来查询, 建普通索引能查到,而建稀疏索引查不到数据.
(9) 创建哈希索引(2.4新增的):哈希索引速度比普通索引快,但是,无能对范围查询进行优化.适宜于---随机性强的散列
db.collectionName.ensureIndex({file:’hashed’});
(10) 重建索引一个表经过很多次修改后,导致表的文件产生空洞,索引文件也如此.
可以通过索引的重建,减少索引文件碎片,并提高索引的效率.
db.collectionName.reIndex()
16.用户
(A) 在mongodb中,有一个admin数据库, 牵涉到服务器配置层面的操作,需要先切换到admin数据.
即 use admin ,相当于进入超级用户管理模式.
(B) mongo的用户是以数据库为单位来建立的, 每个数据库有自己的管理员.
(C) 我们在设置用户时,需要先在admin数据库下建立管理员,这个管理员登陆后,相当于超级管理员.
(1) 添加用户:db.addUser(用户名,密码,是否只读)
use admin
db.addUser(‘sa’,’sa’,false);
(2) 认证
use test
db.auth(用户名,密码);
(3) 修改用户密码
use test
db.changeUserPassword(用户名, 新密码);
(4) 删除用户
use test
db.removeUser(用户名);
(5) 注意: 如果需要给用户添加更多的权限,可以用json结构来传递用户角色参数
例:
use test
db.addUser({user:'guan',pwd:'111111',roles:['readWrite,dbAdmin']});
(6) 注意: 添加用户后,我们再次退出并登陆,发现依然可以直接读数据库
原因: mongodb服务器启动时, 默认不是需要认证的.
要让用户生效, 需要启动服务器时,就指定 --auth 选项.
这样, 操作时,就需要认证了.
17.导入与导出:
(1) 可以操作的是本地的mongodb服务器,也可以是远程的,所以都有如下通用选项:
-h host 主机
--port port 端口
-u username 用户名
-p passwd 密码
(2) mongoexport 导出json格式的文件
-d 库名
-c 表名
-f field1,field2...列名
-q 查询条件
-o 导出的文件名
-- csv 导出csv格式(便于和传统数据库交换数据)
例1:导出news整张表到test.json文件中
./bin/mongoexport -d test -c news -o test.json
例2: 只导出goods_id,goods_name列
./bin/mongoexport -d test -c goods -f goods_id,goods_name -o goods.json
例3: 只导出价格低于1000元的行
./bin/mongoexport -d test -c goods -f goods_id,goods_name,shop_price -q ‘{shop_price:{$lt:200}}’ -o goods.json
(3) 导入
-d 待导入的数据库
-c 待导入的表(不存在会自己创建)
--type csv/json(默认)
--file 备份文件路径
例1: 导入json
./bin/mongoimport -d test -c goods --file ./goodsall.json
例2: 导入csv
./bin/mongoimport -d test -c goods --type csv -f goods_id,goods_name --file ./goodsall.csv
./bin/mongoimport -d test -c goods --type csv --headline -f goods_id,goods_name --file ./goodsall.csv
(4) 导出二进制bson结构的数据及其索引信息
-d 库名
-c 表名
-f field1,field2...列名
例1:
mongodum -d test [-c 表名] 默认是导出到mongo下的dump目录
规律:
1:导出的文件放在以database命名的目录下
2: 每个表导出2个文件,分别是bson结构的数据文件, json的索引信息
3: 如果不声明表名, 导出所有的表
(5) 导入二进制文件
例1:./bin/mongorestore -d test --directoryperdb dump/test/ (mongodump时的备份目录)