1、mongoDB简介:mongoDB 为非关系数据库,集合(collection)关系数据库中的表,中存储的为json结构的文档,集合中的每一条记录都可以结构不同,
但必须都有_id字段(mongoDB默认的Object类型的标识)。
2、mongoDB安装:教程链接:Windows下:http://jingyan.baidu.com/article/d5c4b52bef7268da560dc5f8.html
Linux下:http://jingyan.baidu.com/article/fd8044faf4f3a95030137a79.html
3、mongoDB初级查询语句:
mongoDB语句对应的SQL语句新建数据库:use mydb;//新建一个数据库mydbcreate database mydb查看数据库列表:show dbs //mongoDB自带测试数据库 新建集合:db.student.insert({'name':'lily',age:NumberInt('18','sex':'女')})
插入新的数据,mongoDB自动创建集合,无数据的集合不会显示在列表中
create table student( > name varchar(30), age int, sex varchar(10), primary key (id) )查询全部:db.collection.find();select * from collection; 条件查询:db.collection.find({age:18})
db.collection.find({'sex':'男'})
db.collection.find({age:{$gt:18}})
db.collection.find({age:{$gte:18}})
db.collection.find({age:{$lt:18}})
db.collection.find({age:{$lte:18}})
select * from collection where age=18;
select * from collection where sex='男';
select * from collection where age>18;
select * from collection where age>=18;
select * from collection where age<18;
select * from collection where age<=18;
查询数量:db.collection.find({age:18}).count(); select count(*) from collection where age=18; 分页查询:db.collection.find({age:18}).limit(10).skip(5); select * from collection where age=18 limit 5,10; 查询指定字段:db.collection.find({age:18},{name:1}) select name from collection where age=18;插入数据:db.collection.insert({'name':'lucy',age:28}) insert into collection(name,age) values('lucy',28)删除数据:db.collection.drop({'name':'lucy'})delete from collection where name='lucy'更新数据:db.collection.update({'name':'lily'},{$set:{age:19}})update collection set age=19 where name='lily';模糊条件查询:db.collection.find({'name':/li/})select * from collection where name like %li%;删除集合:db.collection.drop(); drop table collection; 删除数据库 ues mydb
db.dropDatebase();
4、mongoDB 高级查询:
A、聚合:mongoDB 中的aggregate()方法,相当于mysql中的group by。基本语法是:db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION);
eg:db.collection.aggregete([{$match:{age:18}},{$group:{_id:'sex',num:{$sum:1}}}])
对应SQL:select sex count(*) from collection where age=18 group by sex;
B、排序:mongoDB 中的sort()方法,相当于mysql中的order by 。
eg:db.collection.find({'sex':'男'}).sort({age:1});
对应SQL:select * from collection where sex='男' reder by age ASC
db.collection.find({'sex':'男'}).sort({age:-1});
对应SQL:select * from collection where sex='男' reder by age DESC
C.去重:mongoDB中的distinct()方法去重。
eg:db.collection.distinct("name")
对应SQL:select distinct(name) from collection;
D、执行分析:mongoDB中用explain()分析执行过程。
eg:db.collection.find({age:18}).explain();
对应的SQL:explain select * from collection where age=18;
附:explain参数详解:https://my.oschina.net/foreverhui/blog/639240?p={{totalPage}}
5、mongoDB 特有查询:
a、$all匹配所有值
这个操作和SQL的in类似,但是in只需要满足其中的一个值即可,而$all则需要满足所有值。
eg:db.collection.find({age:{$all:[20,21]}})
可以查询出age[20,21,22]但查不出age[20,22,23]即必须同时有20和21。
b、$in查询包含的值
这个操作相当于SQL中的in。
eg:db.collection.find({age:{$in:[20,21]}})
c、$exists判断字段是否存在
eg:查询存在age字段的记录
db.collection.find({age:{$exists:true}})
查询不存在age字段的记录
db.collection.find({age:{$exists:false}})
d、null值的处理
mongoDB 中的null值处理不仅会返回某一字段为null的记录,还会返回不存在该字段的记录
eg:db.collection.find({age:null})
查询结果既有age字段为null的记录还会有不存在age字段的记录。如果需要只查出age字段为null的记录,需要配合$exists
eg:db.collection.find({age:{'$in':[null],'$exists':true}})
查询结果为存在age字段且该字段的值为null
e、$mod取模运算
eg:db.collection.find({age:{$mod:[5,3]}})
查询age取模5为3的记录。
f、$ne不等于操作
eg:db.collection.find({age:{$ne:18}})
g、$nin不包含操作
eg:db.collection.find({age:{$nin:[18,19,20]}})
查询age不等于 18、19、20的记录。
h、JavaScript查询和$where查询
eg:查询年龄大于18的记录有以下四种方式
条件操作符:db.collection.find({age:{$gt:18}})
$where 方式:db.collection.find({$where:'this.age>18'})
内部对象查询:db.collection.find("this.age>18")
JavaScript查询:func = function(){return this.age>18}
db.collection.find(func)
j、存储过程
创建存储过程:db.system.js.save({_id:'addNum',value:function(x,y){return x+y}})
查看所有存储过程:db.system.js.find()
调用存储过程:db.eval("addNum(2,3)")
同时可以直接用db.eval()创建并调用存储过程
db.eval(function (){return 2+3;})
存储过程可以处理数据库内部的操作
db.system.js.save({_id:"getCount",value:function(){return db.collection.find({age:{$gt:18}}).count()}})
将collection中age大于18的记录的数量保存在getCount这个存储过程中,调用时db.eval("getCount()")就可以直接得到那个数量