核心
db.集合.find({查询条件},[{设置显示字段}])
已存在数据如图
带条件查询
db.fnfos.find({"url":"www.google.com"})
查询结果只显示个别字段
0表示不显示 1表示显示
db.fnfos.find({"url":"www.google.com"},{"_id":0});
db.fnfos.find({"url":"www.google.com"},{"_id":0,"url":1});
优雅显示 pretty()
列数多时,可看出效果
db.fnfos.find({"url":"www.google.com"},{"_id":0,"url":1}).pretty();
关系查询
不等于 | $ne |
---|---|
大于 | $gt |
小于 | $lt |
大于等于 | $gte |
小于等于 | $lte |
等于 | key:value 、$eq |
准备操作案例集合
db.students.drop()
db.students.insert({"name":"张三","sex":"男","age":19,"score":89,"address":"海淀区"});
db.students.insert({"name":"李四","sex":"女","age":20,"score":59,"address":"朝阳区"});
db.students.insert({"name":"王五","sex":"女","age":19,"score":99,"address":"西城区"});
db.students.insert({"name":"赵六","sex":"男","age":20,"score":100,"address":"东城区"});
db.students.insert({"name":"孙七","sex":"男","age":19,"score":20,"address":"海淀区"});
db.students.insert({"name":"王八","sex":"女","age":21,"score":0,"address":"海淀区"});
db.students.insert({"name":"刘九","sex":"男","age":19,"score":70,"address":"朝阳区"});
db.students.insert({"name":"钱十","sex":"女","age":21,"score":56,"address":"西城区"});
等于
db.students.find({"name":"张三"}).pretty();
db.students.find({"sex":"男"}).pretty();
小于
db.students.find({"age":{"$gt":19}}).pretty();
年龄大于19岁的学生
db.students.find({"score":{"$lte":60}}).pretty();
成绩小于等于60分的学生
不等于
db.students.find({"name":{"$ne":"王五"}}).pretty();
查询名字不是王五的学生
逻辑查询
与 操作
用逗号(,)分隔若干条件
db.students.find({"age":{"$gte":19,"$lte":20}}).pretty();
查询年龄大于等于19岁 并且 小于等于20岁的学生
非 操作
db.students.find({"age":{"$ne":19}}).pretty();
查询年龄不是19岁的学生
或 操作
db.students.find({
"$or":[
{"age":{"$gt":19}},
{"score":{"$gt":90}}
]
}).pretty();
查询年龄大于19岁,或者成绩大于90分的学生信息
或非 操作
db.students.find({
"$nor":[
{"age":{"$gt":19}},
{"score":{"$gt":90}}
]
}).pretty();
模运算
{$mod:[数字,余数]}
db.students.find({"age":{"$mod":[20,0]}}).pretty();
查询 年龄 20并且余数为0 的学生
db.students.find({"age":{"$mod":[20,1]}}).pretty();
查询 年龄 20并且余数为1 的学生
范围查询
在范围之中 | $in |
---|---|
不在范围之中 | $nin |
db.students.find({"name":{"$in":["张三","李四","王五"]}}).pretty();
查询信息为 张三,李四,王五 的信息
不在范围之内
db.students.find({"name":{"$nin":["张三","李四","王五"]}}).pretty();
数组(列表)查询
添加一些含有数组(列表)的案例操作的集合数据
db.students.insert({"name":"Wilson","sex":"男","age":19,"score":89,"address":"海淀区","course":["语文","数学","英语","音乐","政治"]});
db.students.insert({"name":"Wilson","sex":"男","age":19,"score":89,"address":"海淀区","course":["语文","数学"]});
db.students.insert({"name":"Wilson","sex":"男","age":19,"score":89,"address":"海淀区","course":["语文","数学","英语"]});
db.students.insert({"name":"Wilson","sex":"男","age":19,"score":89,"address":"海淀区","course":["英语","音乐","政治"]});
db.students.insert({"name":"Wilson","sex":"男","age":19,"score":89,"address":"海淀区","course":["语文","政治"]});
{"$all",[内容1,内容2]}
db.students.find({"course":{"$all":["语文","数学"]}}).pretty();
查询同时参加语文和数学课程的学生
$all
可以用于查询数组,也可用于一个数据的匹配
db.students.find({"address":{"$all":["海淀区"]}}).pretty();
$size
数组(列表) 数目
db.students.find({"course":{"$size":2}}).pretty();
查询出参加两门课程的学生
$slice
控制 数组(列表) 返回数目
db.students.find({"age":19},{"course":{"$slice":2}}).pretty();
年龄为19岁所有学生信息,但课程只显示两门(前两门)
年龄为19岁所有学生信息,但课程只显示后两门,设置负数
db.students.find({"age":19},{"course":{"$slice":-2}}).pretty();
取中间两门课程
db.students.find({"age":19},{"course":{"$slice":[1,2]}}).pretty();
利用 索引 查询集合中数组(列表)
key.index
方式定义索引 (0 起始)
db.students.find({"course.1":"数学"}).pretty();
查询数组(列表)中第二个内容(index = 1)
嵌套集合
准备案例操作的集合数据
db.students.insert({"name":"大拿 -A","sex":"男","age":19,"score":89,"address":"海淀区","course":["语文","数学","英语","音乐","政治"],"parents":[{"name":"大拿-A(父亲)","age":50,"job":"工人"},{"name":"大拿-A(母亲)","age":46,"job":"职员"}]});
db.students.insert({"name":"大拿 -B","sex":"男","age":19,"score":89,"address":"海淀区","course":["语文","数学"],"parents":[{"name":"大拿-B(父亲)","age":50,"job":"处长"},{"name":"大拿-B(母亲)","age":46,"job":"局长"}]});
db.students.insert({"name":"大拿 -C","sex":"男","age":19,"score":89,"address":"海淀区","course":["语文","数学","英语"],"parents":[{"name":"大拿-C(父亲)","age":50,"job":"工人"},{"name":"大拿-C(母亲)","age":46,"job":"局长"}]});
$elemMatch
db.students.find({
"$and":[
{"age":{"$gte":19}},
{"parents":{"$elemMatch":{"job":"局长"}}}
]
}).pretty();
查询出学生年龄大于等于19岁并且父母有人是局长的信息
判断字段是否存在
$exists
布尔值,true字段存在,false 字段不存在
db.students.find({"parents":{"$exists":true}}).pretty();
查询有 parents 字段的 学生信息
db.students.find({"course":{"$exists":false}}).pretty();
查询不具有 course 字段的学生信息
where 条件过滤
$where
虽然这种方式实现了数据查询,但是最大的缺点是将在MongoDB里面保存的BSON数据重新变成JavaScript的语法结构,这样的方式不方便使用数据库的索引,不建议此形式使用
db.students.find({"$where":"this.age>20"}).pretty();
查询年龄大于20岁的学生信息
$where
是可以简化的,这类的操作是属于进行每一行的信息判断,实际上对于数据量较大的操作并不方便使用
db.students.find("this.age>20").pretty();
完整的写法可以如下:
db.students.find(function(){
return this.age>20;
}).pretty();
db.students.find({
"$where":function(){
return this.age>20;
}
}).pretty();
查询多个判断
db.students.find({"$and":[
{"$where":"this.age>19"},
{"$where":"this.age<21"}
]
}).pretty();
查询 年龄大于19岁并且小于21岁的学生信息
模糊查询
使用正则运算进行模糊查询
基础语法 | {key:正则标记} |
---|---|
完整语法 | {key:{"$regex":正则标记,“$options”:选项}} |
options主要是设置正则的信息查询的标记
i
忽略字母的大小写m
多行查找x
空白字符串除了被转义的或在字符类中意外的完全被忽略s
匹配所有的字符,包括换行内容
options使用 x
和s
必须使用 $regex
, 其他的可以不带
db.students.find({"name":/大/}).pretty();
匹配 以"大" 开头的姓名
db.students.find({"name":/a/i}).pretty();
不区分大小写 查询 名字中含有a 的学生信息
完整格式
db.students.find({"name":{"$regex":/a/i}}).pretty();
模糊查询数组(列表)中数据
db.students.find({"course":/语/}).pretty();
数据查询排序
sort()
升序(1), 降序(-1)
db.students.find().sort({"score":-1}).pretty();
查询成绩,降序排列
$natural
自然排序,数据保存的先后顺序
db.students.find().sort({"$natural":-1}).pretty();
自然排序的降序显示
数据分页显示
skip(n)
跨过多少数据行
limit(n)
取出的数据行的个数限制
db.students.find().skip(0).limit(5).sort({"age":-1}).pretty();
第一页,skip(0) 跨国0行,limit(5)显示5条数据
db.students.find().skip(5).limit(5).sort({"age":-1}).pretty();
第二页显示,skip(5) 跨过5行,显示5条数据