热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

MongoDB数据库查询基础教程

1.findMongoDB使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档.其形式也是一个文档,说明要查询的细节.空的查询文档{}会匹配集合的全部内容.要是不指定查询文档,默认是{}.如

1.find

MongoDB使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数

决定了要返回哪些文档.其形式也是一个文档,说明要查询的细节.

空的查询文档{}会匹配集合的全部内容.要是不指定查询文档,默认是{}.

如:db.users.find()返回集合users中的所有内容.

向查询文档中添加键值对,就意味着添加了查询条件.对绝大多数类型来说,整数匹配整数,布尔类型匹配布尔类型,字符串匹配

字符串.

2.指定返回的键

有时并不需要返回文档中的所有键值对返回.可以通过find或findOne的第二个参数来指定要返回的键.这样做能节省传输的

数据量,又能节省客户端解码文档的时间和内存消耗.

db.users.findOne({"name":"refactor"},{"age":1,"sex":1})

只会将键为_id,age,sex的数据返回.

"_id"键总是会被返回.

也可以用第二个参数来剔除查询结果中的某个键值对.

如:

键name不会显示在返回的结果中

db.users.findOne({"name":"refactor"},{"name":0})

只会将键为age,sex的数据返回."_id"键是不会返回的

db.users.findOne({"name":"refactor"},{"age":1,"sex":1,"_id":0})

3.查询条件

"$lt","$lte","$gt","$gte"分别对应<,<=,>,>=

如:

查询age >=18  <=30

db.users.find({"age":{"$gte":18,"$lte":30}})

向文档增加键birthday

db.users.update(
  {"name":"refactor"},
  {
    "$set":
    {
      "birthday":new Date("1989/10/26")
    }
  }
)

查询birthday日期是1990-1-1之前的人

db.users.find({"birthday":{"$lt":new Date("1990/01/01")}})

使用"$ne"

查出所有name不等refactor1的文档,注意 文档中不存在键name的文档也会被查出来

db.users.find({"name":{"$ne":"refactor1"}})

使用or查询

MongoDB可以使用"$in","$or"

使用"$in"

查询出pageViews为10000,20000的数据

db.users.find({pageViews:{"$in":[10000,20000]}})

"$in"可以指定不同类型的条件和值,如正在将用户的ID号迁移成用户名的过程中,要做到两者兼顾的查询:

db.users.find({"user_id":{"$in":[12345,"refactor"]}})

这会匹配user_id为12345和"refactor"的文档.

要是 "$in"的数组只有一个值和直接匹配这个值效果是一样的.

db.users.find({"pageViews":{"$in":[10000]}})
db.users.find({"pageViews":10000})

使用"$nin"返回与数组中所有条件都不匹配的文档

如 查出所有pageViews不等10000,20000的文档,注意 文档中不存在键pageViews的文档也会被查出来

db.users.find({"pageViews":{"$nin":[10000,20000]}})

"$in"能对单个键进行or查询.

使用"$or"

db.users.find(
  {
    "$or":
    [
      {"pageViews":{"$in":[10000,20000]}},
      {"url":"http://www.cnblogs.com/refactor"}
    ]
  }
)

这将查询出pageViews是10000,20000或url是http://www.cnblogs.com/refactor的文档.

注意:使用普通的and查询时,要尽量将最苛刻的条件放在前面.

使用"$not"

"$not"可以用在任何条件之上.

如:

db.users.find(
  {"id_num":{"mod":[5,1]}}
)

这会查询出id_num取模后值为1的文档.

db.users.find(
  {"id_num":{"$not":{"mod":[1,5]}}}
)

4.条件句的规则

在查询中,"$lt"在内层文档,在更新中"$inc" 是外层文档的键.

条件句是内层文档的键,修改器是外层文档的键.

可对一个键应用多个条件,但一个键不能对应多个更新修改器.

5.特定于类型的查询

null可以匹配自身,而且可以匹配"不存在的"

能查出url 是"http://www.cnblogs.com/refactor",pageViews为null的文档

db.users.find({"url":"http://www.cnblogs.com/refactor","pageViews":null})

能查出pageViews为null的文档,不存在键pageViews的也能查出来

db.users.find({"pageViews":null})

能查出url 是"http://www.cnblogs.com/refactor",pageViews为null的文档,但不能查出不存在键pageViews的的文档
db.users.find({"url":"http://www.cnblogs.com/refactor","pageViews":{"$in":[null],"$exists":true}})

MongoDB没有"$eq"操作符,但是只有一个元素的"$in"的操作效果是一样的

如果仅仅想要匹配键值为null的文档,既要检查该键的值是否为null,还要通过"$exists"条件判断该键是不是存在.

6.正则表达式

正则表达式能够灵活有效的匹配字符串.

查找所有名包含refact或Refact的用户,使用正则表达式执行忽略大小写的匹配

db.users.find({"name":/refact/i})

系统可以接受正则表达式标识(i),但不是一定有.现在匹配了各种大小写形式的refact.

MongoDB可以为前缀型正则表达式(如:/^refactor/)查询创建索引.所以这种类型的查询非常高效.

正则表达式也可以匹配自身

db.users.find({"name":/refact/})

可以查出name为/refact/的文档.

7.查询数组

数组很大多数情况下可以这样理解:每一个元素都是整个键的值.

db.users.findOne({"userName":"refactor","emails":"295240648@qq.com"})能匹配到

使用"$all"

如果需要多个元素来匹配数组,就要用"$all"

db.users.insert({"userName":"refactor",emails:["295240648@qq.com","295240648@163.com","295240648@126.com"]})
db.users.insert({"userName":"refactor",emails:["295240648@qq.com","295240648@126.com","295240648@111.com"]})
db.users.insert({"userName":"refactor",emails:["295240648@126.com","295240648@163.com","295240648@111.com"]})

要找到邮箱有"295240648@163.com"又有"295240648@126.com",顺序无关紧要的文档
db.users.find(
  {
    "emails":
    {
      "$all":
      [
        "295240648@163.com",
        "295240648@126.com"
      ]
    }
  }
)

要是只对一个元素的数组使用"$all"就和不用"$all"是一样的,如

db.users.find({"emails":{"$all":["295240648@126.com"]}})
db.users.find({"emails":"295240648@126.com"})

效果是一样的.

也可以精确的匹配数组

db.users.find({"userName":"refactor",emails:["295240648@qq.com","295240648@163.com","295240648@126.com"]})

若想查询数组指定位置的元素,需要使用key.index语法指定下标

db.users.find({"emails.1":"295240648@163.com"})

使用"$size"

"$size"可以查询指定长度的数组

查询数组长度为3的数组

db.users.find({"emails":{"$size":3}})

常见的查询是数组长度范围的查询."$size"并不能与其他查询子句组合(如:"$gt"),但是这种查询可以通过

在文档中添加一个"size"键的方式来实现.这样每一次向指定数组添加元素的时候,同时增加"size"值.原来这样

的更新:

db.users.update({"$push":{"emails":"295240648@139.com"}})

变成这样的更新:
db.users.update({"$push":{"emails":"295240648@139.com"},"$inc":{"size":1}})

这样就可以这样查询了

db.users.find({"size":{"$gt":3}})

使用"$slice"查询

find的第二个参数是可选的,可以指定返回那些键,"$slice"返回数组的一个子集合

返回emails数组的前两个元素

db.users.find({"userName":"refactor"},{"emails":{"$slice":2}})

返回emails数组的后两个元素

db.users.find({"userName":"refactor"},{"emails":{"$slice":-2}})

返回emails数组的第2个和第11个元素.如果数组不够11个,则返回第2个后面的所有元素

db.users.find({"userName":"refactor"},{"emails":{"$slice":[1,10]}})

"$slice"默认将返回文档中的所有键. 


推荐阅读
  • 探讨如何优化MongoDB数据库在长时间未访问后首次查询时的性能问题,提供多种解决方案和最佳实践。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 利用 Jest 和 Supertest 实现接口测试的全面指南
    本文深入探讨了如何使用 Jest 和 Supertest 进行接口测试,通过实际案例详细解析了测试环境的搭建、测试用例的编写以及异步测试的处理方法。 ... [详细]
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • 本文详细介绍了如何在MongoDB中创建全文索引及其使用方法。全文索引允许用户通过部分匹配的方式快速搜索文档中的文本内容,但需注意的是,每个集合仅能创建一个全文索引。 ... [详细]
  • 多键索引(MultiKey Indexes)是在包含数组类型字段上创建的特殊索引,旨在优化对数组元素的查询性能。本文将通过实例介绍如何在MongoDB中创建和使用多键索引。 ... [详细]
  • ODBC介绍:开放式数据库连接详解
    本文详细介绍了ODBC(开放式数据库连接),这是一种允许应用程序访问多种数据库系统的标准API。自1992年由微软与Simba合作推出以来,ODBC已成为跨平台数据访问的重要标准。 ... [详细]
  • 利用GitHub热门资源,成功斩获阿里、京东、腾讯三巨头Offer
    Spring框架作为Java生态系统中的重要组成部分,因其强大的功能和灵活的扩展性,被广泛应用于各种规模的企业级应用开发中。本文将通过一份在GitHub上获得极高评价的Spring全家桶文档,探讨如何掌握Spring框架及其相关技术,助力职业发展。 ... [详细]
  • 本文探讨了在 Spring Boot 应用程序中使用 MongoDB 进行复杂文档查询的方法,特别是如何通过实体类映射来处理包含嵌套对象和列表的数据结构。 ... [详细]
  • 近期参与了一个旨在提高在线平台大规模查询响应速度的项目,预计处理的数据量为2-3亿条,数据库并发量约为每秒1500次,未来可能增至3000次。通过对比Redis和MongoDB,最终选择了MongoDB,因其具备优秀的横向扩展性和GridFS支持下的Map/Reduce功能。 ... [详细]
  • ArchSummit深圳2014将于7月18日拉开帷幕,所有讲师已确认,涵盖9个热门话题,共36场精彩报告。InfoQ中文站提供了详细的讲师和报告列表。 ... [详细]
  • 本文详细介绍了如何构建MongoDB的ReplSet复制集群,包括环境准备、配置文件设置以及初始化复制集群的具体步骤。 ... [详细]
  • 本文介绍了使用Node.js开发超市管理系统的经验分享,重点讨论了项目中使用的技术栈及其实现细节,包括前端Bootstrap和后端Express框架的应用,以及MongoDB数据库的操作。 ... [详细]
  • 本文档详细介绍了如何在MongoDB命令行中执行基本操作,包括数据库的选择与创建、文档的插入与查询、文档的更新与删除等。同时,还涵盖了条件查询、统计、模糊查询等高级功能。 ... [详细]
author-avatar
Manordo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有