高级查询(一)
$all 匹配所有
假设有集合 hobbies 内容如下:
_id | name | sex | hobbies |
---|---|---|---|
1 | 小红 | 女 | 唱歌,跳舞,羽毛球 |
2 | 小明 | 男 | 唱歌,乒乓球,羽毛球 |
3 | 小亮 | 男 | 乒乓球,羽毛球 |
查询其中所有喜欢“唱歌”和“羽毛球”的人:
db.hobbies.find({hobbies:{$all:["唱歌","羽毛球"]})
查询结果如图1所示:
图 1
- $all 会查询满足方括号中所有条件的文档,如果只有其中一项满足是不会被查询出来的。
$exists 判断字段是否存在
在集合 hobbies 中更新文档:
db.hobbies.save({_id:1,name:"小红",age:18,sex:"女",hobbies:["唱歌","跳舞","羽毛球"]}) #添加小红年龄18
- 查询 hobbies 集合中存在 age 字段的文档,如图 2 所示:
图 2
- hobbies 集合中不存在 age 字段的文档,如图 3 所示:
图 3
$mod 取模运算
在集合 hobbies 中更新文档:
db.hobbies.update({_id:2},{$set:{age:20}}) #添加小明年龄20
db.hobbies.update({_id:3},{$set:{age:22}}) #添加小亮年龄22
查询 age 取模7等于4的文档:
db.hobbies.find({age:{$mod:[7,4]}})
查询结果如如图4所示::
图 4
$in 包含
查询 age =17或 age =20的文档 :
db.hobbies.find({age:{$in:[17,20]}})
查询结果如图5所示:
图 5
$nin 不包含
查询 age !=17且 age !=20的文档:
db.hobbies.find({age:{$nin:[17,20]}})
查询结果如图6所示:
图 6
$size 数组元素个数
可以查询特定长度的数组,比如 hobbies 这一字段,查询有两个爱好的文档:
db.hobbies.find({hobbies:{$size:2}})
查询结果如图7所示:
图 7
查询结果排序
查询结果排序语法如下:
db.collection.find().sort({_id:1}) #将查询结果按照_id升序排序
db.collection.find().sort({_id:-1}) #将查询结果按照_id降序排序
高级查询(二)
假设数据库有集合 student 如下:
_id | name | age | sex | major |
---|---|---|---|---|
1 | 王晓丽 | 19 | 女 | 计算机 |
2 | 张明 | 21 | 男 | 计算机 |
3 | 秋雅 | 20 | 女 | 播音主持 |
4 | 张欣欣 | 18 | 女 | 表演 |
$or 条件之间的或查询
$or 表示多个查询条件之间是或的关系,比如查询性别 sex 为 男 或年龄 age 为18的文档信息:
db.student.find({$or:[{sex:"男"},{age:18}]})
查询结果,如图8所示:
图 8
$and 条件之间的且查询
$and
表示多个查询条件之间是且的关系,比如查询年龄 age 大于18且小于21(18 < age < 21
)的信息:
db.student.find({$and:[{age:{$gt:18}},{age:{$lt:21}}]})
查询结果,如图9所示:
图 9
$not 条件取反查询
$not 用来执行取反操作,比如查询年龄 age 大于等于20岁,然后进行取反(即查询年龄小于20岁的文档):
db.student.find({age:{$not:{$gte:20}}})
查询结果,如图10所示:
图 10
正则表达式匹配查询
查询不符合major=计*
开头文档:
db.student.find({major:{$not:/^计.*/}})
查询结果,如图11所示:
图 11
count() 返回结果集总数
比如返回上一步正则查询到的结果集有几条:
db.student.find({major:{$not:/^计.*/}}).count()
查询结果,如图12所示:
图 12