Mongodb是非关系型数据库(nosql ),属于文档型数据库数据存储为json类型
在传统的关系型数据库中,数据是以表单为媒介进行存储的,每个表单均拥有纵向的列和横向的行,相比较 MySQL,MongoDB 以一种直观文档的方式来完成数据的存储。它很像 JavaScript 中定义的 JSON 格式,不过数据在存储的时候 MongoDB 数据库为文档增加了序列化的操作,最终存进磁盘的其实是一种叫做 BSON 的格式,即 Binary-JSON。
常用命令
show databases 查看数据库
use database 使用某个数据库
show tables/collections 查看当前数据库的表
表操作
- 创建表:
— 自动创建表:
db.tablename.insert({})
— 手动创建表:db.createCollections('name')
- 删除表
-- db.tablename.drop();
- 删除数据库
-- db.dropDatabase();
- 增删改查
— 增加
db.tablename.insert({_id:1,sex:'n'})
— 增加多条数据db.tablename.insert([{_id:1},{_id:2}])
— 删除db.table.remove()
删除全部表内容db.table.remove({name:24})
条件删除 — 修改 update接收三个参数,第一个参数为更新条件,第二个参数为更新值,第三个是一些选项db.table.update({name:'tz'},{$set:{name:'zt'}})
db.table.update({条件},{$inc:{num:1})
自增(负数表示自减)db.user.update({username:'test'},{$unset:{height:1}})
删除height值db.users.update({username:'test'},{$push:{like:'test'}})原来的属性之上添加
db.users.update({username:'test'},{$pop:{like:1}})
删除最后一个db.users.update({username:'test'},{$pull:{like:'test'}})
指定删除
第二个参数 $set 更新某列 $unset 删除某个列 $rename 重命名某个列 $inc 增长某个列 第三个参数 $upsert (true/false):当为true时,如果第一个参数存在则更新,不存在则创建 $multi(true/false) 当为true时表示修改多行,即修改所有满足条件的列
代码语言:javascript复制db.stu.update({name:"by"},{$inc:{uid:2}},{upsert:true});
- 查询
— find
db.table.find()
查找全部内容db.table.find({age:34})
查找age=34的记录db.table.find({age:{$gt:29}})
查找年龄大于29db.table.find({age:{$lt:29}})
查找年龄小于29db.table.find({age:{$lte:29}})
查找年龄等于29db.table.find({age:{$in:[23,45]}})
年龄在23或45db.table.find({age:{$nin:[23,45]}})
年龄不在23或45db.table.find({age:{$all[1,2,3]}})
age列是一个数组且查找的数据至少包含1,2,3db.table.find({age:{$exits:1}})
查找有age的文档db.table.find({name:/test.*/},{name:1})
查找name字段包含test — where表达式 通过where表达式可以创建更加复杂的查找,但查询速度很慢,如db.stu.find({$where:'this.age%2==0 && id==1})
— 限制查询db.jobs.find().limit(4)
db.jobs.find().skip(4).limit(4)
— 排序db.jobs.find().sort({ id:1//升序 -1降序 })
游标操作 游标是什么? 通俗的说,游标不是查询结果,而是查询的返回资源,或者接口. 通过这个接口,你可以逐条读取. 好处是不用一下把全部数据拿出来,减轻压力
声明游标
代码语言:javascript复制var cursor = db.stu.find();
通过游标取数据
代码语言:javascript复制cursor.next()
一个一个的取显得麻烦,我们可以写一个while循环
代码语言:javascript复制while(cursor.hasNext()){
printjson(cursor.next());
}
索引创建
db.collection.getIndexes();查看索引状态
db.collection.ensureIndex({id:1/-1});创建普通索引1表示升序,-1表示降序
db.collection.ensureIndex({filed:1},{unique:true})创建唯一索引
db.collection.dropIndex({id:1/-1})删除单个索引
……………….dropIndexes()删除所有索引
db.collection.ensureIndex({field:’hashed’});创建hash索引
重建索引
一个表经过很多次修改后,导致表的文件产生空洞,索引文件也如此.
可以通过索引的重建,减少索引文件碎片,并提高索引的效率.
类似mysql中的optimize table
db.collection.reIndex()
Mongodb导出与导入
导出
cd /usr/local/mongodb/
./bin/mongoexport options
options 选项
-h 主机
-port 端口
-u 用户名
-p 密码
-d 数据库名
-c 表名
-f fie,fie,fie… 列名
-q “{name:’tzs’}” 查询条件
-o 导出的文件名称
—type 导出的类型(json/csv)默认json
导入
选项
-d 数据库
-c 表
—type(json/csv) 导入的类型 如果选择了csv类型,需添加—headerLine 选项
—file 导入的文件
分组聚合操作
mongodb也可实现像mysql那样的group by操作,通过mapReduce。
不同的是mapReduce支持分布式,支持大量的服务器同时工作。
mapReduce的工作过程
1.map:将同一组的数据,映射到一个数组上
2.reduce 将数组的值进行运算
3.调用mapReduce 传入map和reduce
如下示例,计算每个栏目的商品数量总和
代码语言:javascript复制var map = function(){
emit(this.cat_id,this.goods_number);
// 第一个参数为组成一组数据的依据
//第二个参数为每组数据统计的字段
}
代码语言:javascript复制var reduce = function(ca_id,values){
//values:每个栏目的商品数量
return Array.sum(values)//对每个栏目的商品数量汇总
}
代码语言:javascript复制db.goods.mapReduce(map,reduce,{out:'res'})
//第三个参数out指定将结果输出到指定的表
db.res.find()//显示结果