1.基本查询
查询集合中所有文档
db.user.find()
使用游标遍历集合
# 使用hasNext() 和 next()
var cursor = db.user.find()
while(cursor.hasNext()){
var temp = cursor.next()
print(temp.name)
}
# 使用forEach()
var cursor = db.user.find()
cursor.forEach(function(temp){
print(temp.name)
})
2.条件查询
2.1 条件查询支持按照指定的字段值精准匹配
db.user.find({name:"tom"})
db.user.find({name:"tom",age:10})
2.2 条件查询还支持各种操作符
来实现更多特定的匹配和筛选
- $or(或)
# 查询年龄为10或11的用户
db.user.find({$or:[{age:10},{age:11}]})
- $gt(大于)
db.user.find({age:{$gt:10}})
- $gte(大于等于)
db.user.find({age:{$gte:10}})
- $lt(小于)
db.user.find({age:{$lt:10}})
- $lte(小于等于)
db.user.find({age:{$lte:10}})
- $ne(不等于)
db.user.find({name:{$ne:"tom"}})
- $type(类型匹配,支持double、string、object、array、bool、date、null、int、long、timestamp...)
# 查询name字段值为字符串的用户
db.user.find({name:{$type:"string"}})
- $exists(字段是否存在)
db.user.find({age:{$exists:true}})
- $mod(取模)
# 查询age取模等于0的文档
db.user.find({age:{$mod:[10,0]}})
- $in(包含)
# 查询年龄字段值包含在[10,11]数组中的文档
db.user.find({age:{$in:[10,11]}})
- $nin(包含)
# 查询年龄字段值不包含在[10,11]数组中的文档
db.user.find({age:{$nin:[10,11]}})
- $not(取非,可与其它操作符结合使用)
db.user.find({age:{$not:{$in:[10,11]}}})
3.特定类型查询
3.1 null
null在MongoDB中表示字段不存在或者字段值为空
# 查询age字段不存在或age字段值为空的用户
db.user.find({"age":null})
# 查询age字段存在且值不为空的用户
db.user.find({"age":{$nin:[null]}})
3.2 正则表达式查询
MongoDB中的正则表达式语法与shell脚本中几乎一致,这里不一一赘述,如有需要自行拓展阅读。
# 查询name字段值以j开头k结尾的用户
db.user.find({"name":/^j.*k$/})
3.3 嵌套文档查询
MongDB中BSON格式的文档支持嵌套。
- 插入一条嵌套文档
db.user.insert({"name":"rose","phone":{"home":"123456","mobile":"123456789"}})
- 精确匹配查询
db.user.find({"name":"rose","phone":{"home":"123456","mobile":"123456789"}})
- 按字段查询(嵌套字段之间以.连接)
db.user.find({"phone.home":"123456"})
3.4 数组查询
文档的某个字段值可以是数组,数组的查询支持多种方式。
- 插入一条字段值包含数组的文档
db.user.insert({"name":"rose","role":[1,2,3]})
- 查询数组中包含某个元素的文档
db.user.find({"role":1})
- $all 查询完全包含指定数组的文档
db.user.find({"role":{$all:[1,2]}})
db.user.find({"role":{$all:[1,2,3]}})
- $size 按数组长度查询
db.user.find({"role":{$size:3}})
- $slice 限定返回数组的部分数据
# 只返回数组的前2个元素
db.user.find({},{"role":{$slice:2}})
# 只返回数组的后2个元素
db.user.find({},{"role":{$slice:-2}})
- 精确匹配
db.user.find({"role":[1,2,3]})
- 索引查询(数组都是有索引的,数组的索引基于元素在数组中的位置)
# 查询role数组中第1个元素值为1的文档
db.user.find({"role.0":1}),
- $elemMatch 元素查询
数组值如果有多个字段(即嵌套文档),需要查询满足多个条件的文档时有两种方式
插入一条数组值为嵌套文档的记录
db.user.insert({"name":"rose","role":[{"roleNo":1,"roleName":"管理员"},{"roleNo":2,"roleName":"vip用户"}]})
按嵌套字段精确查询
db.user.find({"role.roleNo":1,"role.roleName":"管理员"})
使用$elemMatch查询
db.user.find({"role":{$elemMatch:{"roleNo":1,"roleName":"管理员"}}})
4.高级查询
如果查询条件特别复杂,还可以使用$where及JavaScript进行查询。
示例:遍历user文档,如果age>11,给该文档添加一个tag字段
- 使用JavaScript
db.user.find().forEach(function(item) {
if (item.age > 11) {
item.tag = "11岁以上"
}
db.user.save(item)
})
- JavaScript与$where结合使用
db.user.find({$where:"this.age>11")
db.user.find("this.age>11")
还可以在find()中传入JavaScript函数
f = function(){return this.age > 11}
db.user.find(f)
5.查询辅助
还可以在find()之后,对数据的查询进行额外的限定。
- limit 条数限定
# 查询前2条
db.user.find().limit(2)
- skip 起始位置限定
# 跳过前2条,从第3条开始查询
db.user.find().skip(2)
# 跳过前2条,从第3条开始查询2条记录(即第3、4条)
db.user.find().skip(2).limit(2)
- sort 排序
# 按年龄升序
db.user.find().sort({age:1})
# 按年龄降序
db.user.find().sort({age:-1})
以上限定条件可以结合使用。