mongobd 开源的,非关系型数据库。
-- 集合: 表
-- 行数据: 文档
-- 文档是一个键值对(key:value) -- {字段名:数据} --{id:18}
-- 集合:当第一个文档插入时,集合就会被创建
数据库的操作
1.查:
show bds; // 查看所有的数据库
db; // 查看所在的数据库
创建数据库/切换数据库:use 数据名;
2.改:
1)拷贝数据库,再删除原来数据库(可以减少磁盘空间)
db.copyDatabase('旧数据库','新数据库');
整理碎片和回收空间:db.repairDatabase();
2)导出数据库,然后在导入,导入时可以修改名字;
3.删:
db.dropDatabase();
集合的操作
1.增:插入文档时,会自动增加集合
2.查:
show tables; //1
show collections; //2
3.改:
db.集合名.renameCollection('新名字');
4.删:
db.集合名.drop();
文档的操作
1.增:
//1 有这条数据的话,报错
db.集合名.insert({字段名:数据, 字段名:数据...});
//2 有这个数据,则改之,无则加之
db.集合名.save({字段名:数据, 字段名:数据...});
// 批量增加
db.集合名.find().forEach(function(x){db.新集合名.insert(x)});
如果数据是字符串,要加单引号或双引号。
2.查
db.集合名.find(); //查看集合内所有的文档,默认显示20条
//设置显示的条数为30
DBQuery.shellBatchSize=30;
db.集合名.find().pretty(); //json式查看
db.集合名.findOne(); //查看一条信息
db.集合名.find({}, {字段名:1}); // 1表示显示,0表示不显示
//查询id为2的信息
db.集合名.find({id:2});
1) 同一字段的数据类型可以不一样
2) $lt 小于
$lte 小于等于
$gt 大于
$gte 大于等于
$ne 不等于
$in 在什么范围内
// 查询小于2的信息
db.集合名.find({id:{$lt:2}});
清屏命令:cls
3.删除文档
db.集合名.remove({条件});
eg: db.test.remove({name:'mco'});
db.集合名.remove({条件}, 是否只删除一条信息);
eg: db。test.remove({_id:{$lt:3}}, 1); // 第二个参数 1或true 代表删除一条数据 如果没有加上这个参数,则 默认是删除多条数据
db.集合名.remove({条件}, 是否只删除一条信息, 错误抛出); //后面两个参数是可选的
4.改:
db.集合名.update({条件}, {$set:{修改的字段}});
db.集合名.update({条件},{$set:{修改的内容}}, 无是否加之,是否更新多条,异常抛出)
更新数据格式如下:
db.collection.update(
,
,
{
upsert: ,
multi: ,
writeConcern:
}
)
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew, true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true, 就把按条件查出来多条记录全部更新。
*writeConcern :可选,抛出异常的级别。
实例:
我们在集合test中插入如下数据:
>db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
url: 'http://www.baidu.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
接着我们通过 update() 方法来更新标题(title):
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.test.update(
{
_id:{$lte:3}},--条件
{$set:{name:'test333'} --修改的内容
},false,--如没有这条件,就不添加文档
true -----如果为false,只会更改一条信息
)
db.test.update(
{_id:6},{$set:{name:'test333'}},
true,----如没有这条件,就添加文档
true
)
数据库的导入导出
1) 在Linux下导入数据库:
/usr/local/mongodb/bin/mongoexport -d 要导入的数据库名 -c 要导入的集合名 -o 导入的数据库;
2) 导出数据库:
/usr/local/mongodb/bin/mongoexport -d 要导出的数据库 -c 要导出的集合名 --csv -f _id -o 要导出的数据库名;
以上是csv格式,默认的是json格式
/usr/local/mongodb/bin/mongoexport --help 查看用法
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导出那些列
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
1.语法: db. student .ensureIndex({KEY:1})
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
2.创建复合索引: db. student .ensureIndex({a:1,b:-1})
3.查看某库上的所有索引: db.system.indexes.find()
4.查看某表上的所有索引: db. student .getIndexes()
5.查看explanin执行计划: db.student.find({age:6}).explain()
6.删除集合上的某个索引: d b. student .dropIndex({a:1})
7.删除集合上的所有索引: db. student .dropIndexes()
1.创建
db.集合名.ensureIndex({class:1}); // 字段名
2.查看
db.集合名.getIndexes();
查看系统上所有索引
db.system.indexes.find();
2.删除
db.集合名.dropIndex("索引名");
//删除所有的索引
db.集合名.dropIndexes();
聚合
-- sum, max, min, avg
student--集合名
1.每个班级有多少人个学生;
db.student.aggregate
(
[
{
$group:{
_id (主键):{class (班级):'$class'},
count:{$sum:1}
}
}
]
)
2.按班级和岁数统计有多少人
db.student.aggregate
(
[
{
$group:{
_id:{class:'$class', age:'$age'},
count:{$sum:1}
}
}
]
)
3.求各班的平均年龄
db.student.aggregate
([{
$group:{
_id:{class:'$class'},
avg:{$avg:"$age"}
}
}])
db.student.aggregate([{$group:{ _id:{class:'$class'},avg:{$avg:"$age"}}}])
4.求各班的最大年龄
db.student.aggregate
([{
$group:{
_id:{class:'$class'},
max:{$max:'age'}
}
}])
db.student.aggregate([{$group:{ _id:{class:'$class'}, max:{$max:"$age"} }}]);
练习
1.db.student.find()查询命令默认只能显示20条信息
如果需要扩大显示条数,需要设置 DBQuery.shellBatchSize=30
2.查看悟空的详细信息
db.student.find({name:'wudong'});
3.查看数学分数为90,并且语文分数为82的学生信息
db.student.find({math:90, chinese:82});
4.查询年龄大于10岁,班级在3班的学生信息
db.student.find({age:{$gt:10}, class:3});
5.查询年龄大于10岁,班级在3班的学生信息并且只返回一条信息
db.student.findOne({age:{$gt:10}, class:3});
6.显示学生姓名,年龄,班级
db.student.find({}, {name:1, age:1, class:1});
7.显示学生的不同年龄
db.student.distinct('age');
8.显示集合的记录总数
db.student.find().count();
9.查询综合1大于10的学生信息
db.student.find({'other.0':{$gt:10}});
db.student.find({'other.0':{$gt:10}}).pretty();
{
"_id" : 5,
"name" : "wuwa",
"sex" : "man",
"age" : 6,
"class" : 1,
"number" : 5,
"math" : 80,
"chinese" : 89,
"english" : 92,
"other" : [
20,
20,
30
]
}
10.查询综合2大于20的学生信息
db.student.find({'other.1':{$gt:20}});
11.查询综合3大于50的学生信息
db.student.find({'other.2':{$gt:50}});
12.查询_id为10-20的学生信息
db.student.find({_id:{$gte:10, $lte:20}});
13.查询年龄是6岁或11岁的学生信息
db.student.find({age:{$in:[6, 11]}}); //1
db.student.find({$or:[{age:6}, {age:11}]}).pretty(); //2
14.查询年龄不是6岁且不是11岁的学生信息
db.student.find({age:{$nin:[6, 11]}}).pretty();
15.查询number为空的学生信息
db.student.find({number:null}).pretty(); //1
db.student.find({number:{$in:[null], $exists:true}}).pretty(); //2 $exists检测是否有字段
16.从小到大排序年龄
// sort里age后面的1表示从小到大的排序(默认),-1表示从大到小
db.student.find({}, {age:1}).sort({age:1}).pretty();