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时表示修改多行,即修改所有满足条件的列
db.stu.update({name:"by"},{$inc:{uid:2}},{upsert:true});
db.table.find()
查找全部内容
db.table.find({age:34})
查找age=34的记录
db.table.find({age:{$gt:29}})
查找年龄大于29
db.table.find({age:{$lt:29}})
查找年龄小于29
db.table.find({age:{$lte:29}})
查找年龄等于29
db.table.find({age:{$in:[23,45]}})
年龄在23或45
db.table.find({age:{$nin:[23,45]}})
年龄不在23或45
db.table.find({age:{$all[1,2,3]}})
age列是一个数组且查找的数据至少包含1,2,3
db.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降序 })
游标操作 游标是什么? 通俗的说,游标不是查询结果,而是查询的返回资源,或者接口. 通过这个接口,你可以逐条读取. 好处是不用一下把全部数据拿出来,减轻压力
声明游标
var cursor = db.stu.find();
通过游标取数据
cursor.next()
一个一个的取显得麻烦,我们可以写一个while循环
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
如下示例,计算每个栏目的商品数量总和
var map = function(){
emit(this.cat_id,this.goods_number);
// 第一个参数为组成一组数据的依据
//第二个参数为每组数据统计的字段
}
var reduce = function(ca_id,values){
//values:每个栏目的商品数量
return Array.sum(values)//对每个栏目的商品数量汇总
}
db.goods.mapReduce(map,reduce,{out:'res'})
//第三个参数out指定将结果输出到指定的表
db.res.find()//显示结果