MongoDB - 文档查询

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})

以上限定条件可以结合使用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 目录 查询操作 集合查询方法 find() 查询内嵌文档 查询操作符(内含 数组查询) "$gt" 、"$gte"...
    彩虹之梦阅读 1,008评论 0 1
  • mongodb使用find()方法执行查询操作, 语法 参数解析 query 可选,指定查询操作条件 proje...
    非文666阅读 2,009评论 1 1
  • 以米燕的成长轨迹为主线,写在大山里长大的60后、70后女孩的命运。 阳历七月初,天气已经很燥热,知了爬在树上,恼人...
    沐儿阅读 2,182评论 98 34
  • 回忆,无关乎是过去,是昨天。昨天发生了什么也许还记得,但过去,过去发生了什么已经模糊了,斑驳了。 细细想来,回忆着...
    弓长目目阅读 409评论 0 1