一、填空题
- 大数据时代对数据存储的挑战包括高并发读写需求、高效率存储和访问需求、高扩展性。
- NoSQL是Not Only SQL的缩写,它的含义为“不仅仅是SQL”。
- NoSQL是一种非关系型、分布式、不遵循ACID、不提供SQL功能的数据库。
- NoSQL理论的基础是由CAP原则、BASE理论以及最终一致性奠定的。
- NoSQL数据库主要有四大类型,键值对存储数据库、文档存储数据库、列式存储数据库及图形存储数据库。
- 当前NOSQL数据库产品中最热门的一种数据库是mongodb
- mongodb是由C++语言编写的
- mongodb是一个面向集合、模式自由的文档型数据库。
- mongodb的设计采用水平拓展,可通过分片将数据分布在集群机器中。
- mongodb的逻辑结构是体系结构的一种形式。
- MongoDB是一个开源、跨平台的数据库。
- Mongod程序用于启动MongoDB服务器。
- MongoDB服务的端口号是27017。
- 聚合管道是使用不同的管道阶段操作器进行不同的聚合操作。
- MongoDB提供Map-Reduce 操作来进行聚合操作。
- MongoDB副本集的成员包括 主结点、副本结点、 仲裁结点。
- MongoDB官网推荐副本集成员个数为 奇数 个。
- 副本集主要功能包括 维护冗余地数据库副本、 故障自动转移、读写分离。
- 开启安全认证时,密钥文件权限一定要等于或小于 600。
- 副本集成员配置信息中参数 priority表示优先级。
- MongoDB分片是MongoDB支持的另一种集群形式。
- 分片技术是开发人员用来提高 数据存储和数据读写吞吐量常用的技术之一。
- 分片主要是将数据进行 划分后,将它们分别存放于不同机器上的过程。
- MongoDB之所以能够实现自动分片,这是因为其内置了 分片策略。
- MongoDB的分片策略主要包括范围分片和 哈希分片两种。
二、判断题
- NoSQL是非关系型数据库。 ( × )
- 非关系型数据库采用的是动态结构存储数据。 ( √)
- CAP原则包括一致性、可用性和分区容错性这三大要素。 ( √ )
- CAP理论 的核心思想是即使无法保证系统的强一致性。 ( ×)BASE理论的核心思想是即使无法保证系统的强一致性
- 数据的一致性可根据强度分为强一致性和弱一致性两种。 ( √ )
- 在mongodb中数据库存储着集合和数据表。 (X)
- mongodb默认提供admin、local、config以及test数据库。(√)
- 集合就是mongodb的一组文档,分为一般集合和下限集合。 (√)
- 文档中不能有重复的键,每一个文档都有一个默认_id键。 (√)
- 支持3种数字类型(32位整数(int32)、64位整数(int64)和64位浮点数(Double))。 (√)
- 针对不同的操作系统平台,MongoDB的部署均相同。(X)
- MongoDB中管道操作符的类型单一。(X)
- Map-Reduce操作有两个阶段.即 Map和 Reduce阶段。(ü)
- 默认情况下.MongoDB 服务启动运行时是启用用户访问权限控制的。(X)
- Robo 3T是一个跨平台的 MongoDB GUI客户端管理工具。(ü)
- 推荐使用主/从复制方式实现MongoDB 副本集复制。 ( × )
- MongoDB副本集通过同时存在多个 一个 主节点,实现故障自动转移。 ( × )
- 副本节点与主节点同步副本是异步同步。 ( √ )
- 仲裁节点不会同步主节点的数据副本。 ( √ )
- 配置副本集成员需要在主节点进行操作。 ( √ )
- 分片与副本集主要区别在于分片是每个节点存储数据的不同片段,而副本集是每个节点存储数据的相同副本。 ( √ )
- 块(Chunk)的默认大小为128MB 64MB。 ( ×)
- 分片键只能是集合文档中的一个 或多个字段。 ( × )
- 分片服务器是实际存储数据的组件。 ( √ )
- 生产环境中,路由 配置服务器存储了分片集群的元数据。 ( × )
- 最终一致性要求系统数据副本最终能够一致,而不需要实时保证数据副本一致。( √ )
- 键值对存储数据库是NoSQL 数据库中的一种类型,键值对存储数据库中的数据是以键值对的形式来存储的。( √ )
- MongoDB的集合是动态模式的,同一个集合里面的文档可以是各式各样的。( √ )
- MongoDB支持的数据类型中不包含对象0bject。( × )
- 文档型数据库缺乏统一的查询语法。( √ )
- 文档键(field)的命名不能包含\0或空字符、不能包含.(点号)、能以$开头。( × )
- 如果插入文档的时候没有指定“_id”值,系统会自动帮你创建一个,每个文档都有唯一的_id。( √ )
三、选择题
- 下列数据库中,哪个是最简单的NoSQL数据库?( A)
- 键值对存储数据库
- 文档存储数据库
- 列式存储数据库
- 图形存储数据库
- 下列说法中,关于文档存储数据库说法正确的是?(C)
- 文档存储数据库不是文档管理系统
- 文档存储数据库是用于存储和管理文档,其中文档是非 结构化的数据
- 文档存储数据库存储的文档可以是不同结构的
- 文档 键值对存储数据库主要应用于会话存储和购物车等场景
- 下列选项中,哪个属于列式存储数据库?(D )
- MongoDB文档存储数据库
- Redis键值对存储数据库
- Neo4j图形存储数据库
- HBase
- 在下列数据库中,( B )不是mango DB默认提供的。
- admin数据库
- user数据库
- config数据库
- test数据库
- 下列说法中,关于MongoDB文档说法正确的是( D )
- A.mongoDB单个文档大小上限为64MB
- B.文档的值只可以是字符串类型
- C.文档中可以有重复的键
- D.不建议自定义_id键
- 下列选项中属于mongodb支持的数据类型是( C )
A.String
B.Code
C.Enum
D.Null
- 下列命令中,( C )可以用于创建MongoDB数据库。
- create
- show
- use
- db
- 下列选项中,( D )不属于管道操作符。
A.$ group
B.$ limit
C.$ match
D.$ and
- 下列说法中,关于MongoDB索引说法正确的是( B D ).
- 索引存储着集合中全部的文档
- 索引项的排序支持有效的等值匹配和基于范围的查询操作
- 索引分为单字段索引和复合索引两种
- 索引是一种特殊的数据结构,即采用B-Tree数据结构
- 下列选项中,哪个不属于副本集成员状态?( A )
- START
- DOWN
- RECOVERING
- UNKNOWN
- 下列选项中,哪个不属于副本集的功能?( B)
- 冗余的数据
- 负载均衡
- 读写分离
- 自动故障转移
- MongoDB副本集中,副本节点是如何获得主节点数据?(A )
- 自动拉取
- 心跳
- 自动推送
- 手动
- 下列服务器中,哪个不是服务器分片集群的组成部分?( D )
- Shard
- Mongos
- Config Server
- Mongod
- 下列选项中,关于块的说法正确的是?( A )
- 块的默认大小为64MB
- 大块触发的迁移较多 少
- 块的大小不 会影响要迁移块的最大文档数
- 大块 不均匀; 小块可以均匀地分布数据
- 下列说法中,关于分片键说法错误的是?( B)
- 分片键一旦指定,后续则无法改变
- 分片键的长度大小, 不可可 超过512个字节
- 用于作分片键的字段必须创建索引
- 不允许在已分片的集合文档上插入没有分片键的文档
- 下面的代码段中,能够找出comment 集合中的文档数的是()。
- db.comment.update0
- db.comment.findO.
- db. comnent. count().
- db. comment.insert().
- 下面代码段中,能够删除comment 集合的是()。
- db.comment.drop()
- db.Dropcomment()
- db.comment.delete()
- db.comment.remove()
- 下面哪条语句能编译通过?()
- db.comment.find(name : james)
- db. comment.find({name : james})
- db.comment.find({name: “james”})
- db. comment.find{name : “james”}
- 下列语句中,(D)能够找到comment 集合中年龄大于等于30的文档。
- db. comment.find( {age:{$lt:30}})
- db.comment.find( {age:{$gt:30}})
- db.comment.find({age:{$lte:30}})
- db.comment.find( {age : {$gte : 30} })
- 下列数据库中,数据库(C)不属于非关系型数据库。
- HBase
- MongoDB
- Oracle
- Redis
- MongoDB采用(B)格式完成存储数据和网络数据交换。
- BSON
- JSON
- 二进制
- Object
四:简答题
1.简述CAP原则的选择策略与应用场景。
CAP原则一个分布式系统最多可以同时实现两个要素,即AP或CP或AC。选择AC策略,意味着放弃P,也就是说,保证了系统的一致性和可用性,却违背了分布式系统的分区容错性;选择CP策略,意味着放弃A,也就是说,保证了系统的一致性和分区容错性,但用户的体验较差,即当系统宕机时,需要等待所有节点的数据一致时,用户才可访问系统;选择AP策略,意味着放弃C,也就是说,保证了系统的可用性和分区容错性,但是节点之间的数据会出现不一致的现象。因此,我们可以根据自己的需求,选择对应的策略。
2.简述NoSQL数据库的四种类型。
3. 简述MongoDB数据库的优势。
1. 易用性
MongoDB面向文档的数据库不再有“行”的概念,取而代之的是更为灵活的“文档”模型。通过在文档中嵌入文档和数组的方式,在一条记录中表现复杂的层级关系。另外,MongoDB没有预定义模式,文档的键和值无须定义固定的类型和大小,这使得添加或删除字段变得更为容易,因此开发者能够进行快速迭代,加快开发进程。
2. 高性能
1、对文档进行了动态填充,对数据文件进行了预分配数据文件,用空间来保证性能的稳定。
2、优化器会标记出查询效率最高的方式,以便生成高效的查询计划。
3、提供高性能数据持久性减少数据库系统的I/O活动,也可以通过索引支持更快的查询。
4、将大部分的内存用作缓存。
3. 高可用性
MongoDB副本所组成的一个集群,称为副本集,它提供了自动故障转移和数据冗余功能,以防止数据丢失,从而提高数据的可用性。
4. 易扩展性
MongoDB的设计采用横向水平扩展,可通过分片将数据分布在集群机器中。MongoDB能够自动处理跨集群的数据和负载,自动重新分配文档,并将用户的请求路由到正确的机器上。
5. 多种存储引擎
MongoDB支持多个存储引擎包括WiredTiger存储引擎、内存存储引擎(In-Memory)和MMAPv1存储引擎。
4. 简述MongoDb索引的6中类型。
答:
1.单字段索引
MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,因此也被成为单字段索引。默认情况下,MongoDB中所有集合在_id字段上都有一个索引,当然,用户也可以根据自己的需求添加额外索引来支持重要的查询和操作。由于MongoDB可以从任何方向遍历索引,因此对于单个字段索引和排序操作来说,索引项的排序顺序(即升序和降序)并不重要。
2.复合索引
所谓复合索引,就是包含多个字段的索引,一个复合索引最多可以包含31个字段。需要注意的是,若某字段数与哈希索引,则这是复合索引就不能包括该字段。
3.多键索引
若文档中的字段为数组类型,则每个字段都是数组中的一个元素,MongoDB将会为数组中的每个元素创建索引,因此被称为多键索引。多键索引允许通过匹配数组的一个或多个元素来查询包含该数组的文档。如果索引字段包含数组值,则MongoDB会自动确定是否创建多键索引,而无须显示地指定创建多键索引。
4.地理空间索引
为了支持对地理空间坐标数据的有效查询,MongoDB提供了两种特殊的索引,即返回结果时使用平面几何的二维索引(2d索引)和返回结果时使用球面几何的二维球面索引(2dsphere索引)。其中,2d索引支持在欧几里德平面上的计算,也支持计算球面上的距离;2dsphere索引支持球面上几何计算的查询,包含查询(在一个指定多边形内的位置进行查询)、 交集查询(查询指定几何相交的位置)和临近查询(如查询离另一个点最近的点)。我们可以通过将2d索引和2dsphere索引进行相结合,从而进行高效的地理空间查询。
5.文本索引
MongoDB提供了一种文本索引类型,支持在集合中搜索字符串内容,即进行文本检索查询。文本索引不存储特定语言的停止词,例如“the”、“a”以及“or”等词,而是将集合中的词作为词干,只存储根词。为了执行文本检索查询,则集合上必须有一个text索引。一个集合只能拥有一个文本检索索引,但是这个索引可以覆盖多个字段。
6.哈希索引
为了支持基于哈希分片键进行分片,MongoDB提供了哈希索引类型。哈希索引是使用哈希函数来计算索引字段的哈希值,若是该索引字段的哈希值在哈希索引的范围内,则分布的更加随机。需要注意的是,哈希索引只支持等值匹配,不支持基于范围的查询。
5. 请描述下MongoDB的副本集时如何同步数据?
副本节点定期轮询主节点获取oplog记录的操作内容,然后对自己的数据副本执行这些操作,从而保证副本节点的数据副本与主节点保持一致。
6. 简述分片集群的架构。
分片集群中主要由三个部分组成,即分片服务器(Shard)、路由服务器(Mongos)以及配置服务器(Config Server)组成。其中,分片服务器有三个,即Shard1、Shard2、Shard3;路由服务器有两个,即Mongos1和Mongos2;配置服务器有三个,即主、副、副。
7. 简述客户端在GridFS中查询文件的过程。
当客户端在GridFS中查询文件时,MongoDB将首先从集合fs.files中获取该文件的元数据信息,然后根据获取的元数据信息在集合fs.chunks查找符合要求的块(即files_id与元数据中_id相同的块),最后将这些块从新组装后返回给客户端。
8.理解 CAP 原则、BASE 理论、最终一致性的内容。
CAP 原则:c一致性、a可用性、p分区容错性。
BASE 理论:基本可用、软状态、最终一致性。
最终一致性:一致性分为强一致性和弱一致性,其中最终一致性是指保证用户最终能够读取到某操作对系统特定数据的更新。
9.NoSQL 数据库与传统关系型数据库的区别
1、 存储方式不同
传统的关系型数据库采用表格的储存方式,而非关系型数据通常以数据集的方式,大量的数据集中存储在一起,类似于键值对、图结构或者文档。
2、 存储结构不同
关系型数据库按照结构化的方法存储数据。而NoSQL数据库采用的是动态结构,对于数据类型和结构的改变非常的适应,可以根据数据存储的需要灵活的改变数据库的结构。
3、 存储规范不同
关系型数据库为了避免重复、规范化数据以及充分利用好存储空间,把数据按照最小关系表的形式进行存储。而NoSQL数据库的数据存储方式是用平面数据集的方式集中存放。
4、 扩展方式不同
这是NoSQL数据库与关系型数据库差别最大的地方。关系型数据库为缓解多张数据表的操作中数据操作的瓶颈只能提高处理能力,关系型数据库只具备纵向扩展能力。而NoSQL数据库由于使用的是数据集的存储方式,它的存储方式一定是分布式的,它可以采用横向的方式来开展数据库,也就是可以添加更多数据库服务器到资源池,然后由这些增加的服务器来负担数据量增加的开销。
5、 查询方式不同
关系型数据库采用结构化查询语言(即SQL)来对数据库进行查询。NoSQL数据库使用的是非结构化查询语言(UnQL),它以数据集(像文档)为单位来管理和操作数据,由于它没有一个统一的标准。
6、 规范化不同
关系型数据库必须进行数据规范化处理这个过程实现复杂。对于NoSQL数据库则没有这方面的问题,它不需要规范化数据,它通常是在一个单独的存储单元中存入一个复杂的数据实体。
7、 事务性不同
关系型数据库强调ACID规则(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)),可以满足对事务性要求较高或者需要进行复杂数据查询的数据操作。NoSQL数据库的性能和优点更多的体现在大数据的处理和数据库的扩展方面。
8、 读写性能不同
关系型数据库十分强调数据的一致性,并为此降低读写性能付出了巨大的代价。而NoSQL数据库在应对大数据方面无论是扩展还是读写都非常容易并且NoSQL数据库大数据管理、检索、读写、分析以及可视化方面具有关系型数据库不可比拟的优势。
9、 授权方式不同
关系型数据库常见的有Oracle、SQL Server、DB2、MySQL,除了MySQL大多数的关系型数据库如果要使用都需要支付一笔价格高昂的费用,即使是免费的MySQL性能也受到了诸多的限制。而对于NoSQL数据库,比较主流的有redis、HBase、MongoDb、memcache等产品,通常都采用开源的方式,不需要像关系型数据库那样,需要一笔高昂的花费。
10、理解 MongoDB 的体系结构
层次结构,由文档、集合、数据库三部分组成。
11、MongoDB 的数据类型
String(字符串): mongodb中的字符串是UTF-8有效的。
Integer(整数): 存储数值。整数可以是32位或64位,具体取决于您的服务器。
Boolean(布尔): 存储布尔(true/false)值。
Double(双精度): 存储浮点值。
Min/ Max keys(最小/最大键): 将值与最低和最高BSON元素进行比较。
Arrays(数组): 将数组或列表或多个值存储到一个键中。
Timestamp(时间戳): 存储时间戳。
Object(对象): 嵌入式文档。
Null (空值): 存储Null值。
Symbol(符号): 与字符串相同,用于具有特定符号类型的语言。
Date(日期): 以UNIX时间格式存储当前日期或时间。
Object ID(对象ID) : 存储文档ID。
Binary data(二进制数据): 存储二进制数据。
Code(代码): 将JavaScript代码存储到文档中。
Regular expression(正则表达式): 存储正则表达式
数字类型((32位整数(int32)、64位整数(int64)和64位浮点数(Double))、日期类型、数组类型(mongodb数组是元素的集合,中括号[]表示数组。)、Objectld类型(12字节BSON类型)、内嵌文档、Code类型
12、MongoDB 的文档命名规则
文档使用规范
文档中键的类型一般是字符串类型,键可以使用任意UTF-8字符。关于文档的命名需要注意以下几点:
- 文档中的键不能含有\0字符,即空字符;
- 文档中的键禁止使用任何除下画线_以外的特殊字符,并且开头不建议使用
- 文档中的键建议全部为小写;
- 文档中的键不建议以数字开头;·不建议自定义文档中_id的值;
- 尽量将相似类型的文档放在同一个集合中,将不同类型的文档分散在不同的集合中,这样可以提高索引的利用率;
- 建议不要存储过长的字符串,如果这个字段为查询条件,那么确保该字段的值不超过1KB,因为 MongoDB索引仅支持1KB以内的字段;
- 建议若业务上对于存放数据大小写不敏感,则使用全部大写/小写存放(或增加一个统一大小写的辅助字段);
- 建议尽量不要使用数组字段作为查询条件;·同一文档中,不可以存在相同名称的键。
13、MongoDB 副本集的成员及其作用
主结点、副本结点、仲裁结点
1.主结点
主结点是副本集中负责处理客户端请求和读写数据主要成员。主结点通过oplog(操作日志)记录所有操作。副本集中有且只有一个主结点,如果当前主结点不可用,则会从副本结点中选举出新的主结点。
2.副本结点
副本结点定期轮询主结点来获取 oplog记录的操作内容,然后对自己的数据副本执行这些操作,从而保证副本结点的数据副本与主结点保持一致。副本集中可以有一个或多个副本结点。当主结点宕机时,副本集会根据副本结点的优先级进行选举,确定哪个副本结点成为新的主结点。
3.仲裁结点
仲裁结点不会同步主结点的数据副本,也不会被选举为主结点,它主要是参与选举投票。由于仲裁结点没有访问压力,比较空闲,因此仲裁结点需要的资源很小。当副本集中成员个数为偶数时,建议添加一个仲裁结点,防止选举新的主结点过程中出现票数一致,导致无法选举出新的主结点,使副本集处于只读状态无法写入数据。
14、MongoDB 分片集的成员及其作用
分片集群中主要由三个部分组成,即分片服务器(Shard)、路由服务器(Mongos)以及配置服务器(Config Server)组成。其中,分片服务器有三个,即 Shard1 ,Shard2和 Shard3;路由服务器有两个,即 Mongosl和 Mongos2;配置服务器有三个,即主、副、副。下面,我们针对分片集群架构中的组成部分进行详细介绍,具体如下。
1. 分片服务器
分片服务器即MongoDB实例(即mongod,用Shard表示)。分片服务器是实际存储数据的组件,持有完整数据集中的一部分,每个分片服务器都可以一个MongoDB实例,也可以是一组 MongoDB 实例组成的集群(副木隼)从MongoDB 3.6开始,必须将分片部署为副本集,这样具有更好的容错性。
2.路由服务器
路由服务器即 mongod,主要提供客户端应用程序与分片集群交瓦的接口,所有请求都需要通过路由服务器进行协调工作。路由服务器实际上就是一个消息分发请求中心,它负责把客户端应用程序对应的数据请求转发到对应的分片服务器上。应用程序将查询、存储、更新等请求原封不动地发送给路由服务器。路由服务器询问配置服务器操作分片服务器需要获取哪些元数据,然后连接相应的分片服务器进行相关操作,最后将各个分片服务器的响应进行合并,返回给客户端应用程序。
生产环境中,一个分片集群通常会有多个路由服务器,一方面可以解决多个客户端同时请求,从而达到负载均衡的效果;另一方面可以解决当路由服务器宕机时导致整个分片集群无法使用的问题。
3.配置服务器
配置服务器即Config Server。在生产环境中,通常需要多个配置服务器,因为它存储了分片集群的元数据,并且这些数据是不允许丢失的。因此,需要配置多个配置服务器以防止数据丢失,即使其中一台配置服务器宕机,我们还有其他配置服务器,从而保证MongoDB分片集群依然能够正常工作。从 MongoDB 3.4版本开始,配置服务器必须部署副本集,因此我们需要配置三个配置服务器组成的副本集。
配置服务器存储着分片集群的持久化元数据,而路由服务器存储着分片集群的非持久化元数据,这些数据均为内存缓在的数据。当路由服务器初次启动或关闭重启时.就会从配置服务器中加载分片集群的元数据芳具配詈服务器的信息发生亦化,则会涌知所有路由服务器更新自己的状态,这样路由服务器就能继续准确地协调客户端与分片集群的交互工作。
五、编程题
(1)请查询出年龄等于19岁或者年龄等于18岁的学生信息;(5分)。
db.students.find ({$or:[{age: 19} ,{age:18}]}).
db.students.find ({age:{$in:[18,19]}}).
(2)请查询出成绩为空值的学生信息;(5分)。
db.students.find({score: {$in:[null],$exists:true}} )
db.students.find({score:null,score:{$exists:true}})
(3)请查找出学生一共有哪几种不同的专业;(3分)
db.students.distinct(“major”).
(4)请查询出计算机应用技术专业和软件技术专业成绩大于90分的女生姓名和专业;(6分)
db.students.find( { $or: [ {major:”XXX”, score:{$gt:90},sex: “female”}, {major:”YYY”, score:{$gt:90}, sex: “female”} ]}, {_id:0, name:1, major:1})
或
db. students.find({$and:[ {major:”计算机应用技术”},{ major:“软件技术”},{score : {$gt :90}} ,{sex:”female”}]},{_id:0, name:l,major: 1)。
(5)分页查询:按照分数(score)降序的顺序进行分页显示,每页只显示3条文档;
db. students.find( ). sort({score:-1}).limit(3)
db. students.find( ). sort({score:-1}).skip(3).limit(3)
db. students.find( ). sort({score:-l}).skip(6).limit(3)
(6)请将陈好的专业(major)修改为移动应用开发;(5分)。
db.students.update({name:“陈好”},{$set:{major:“移动应用开发”})
(7)更新专业(major)为软件技术的所有文档,将分数(score)加上2。(5分)。
db.students.update({major:“软件技术”},{$inc:{score:2}},{multi:true})
创建数据库
> use myDB
查看数据库
>show dbs
删除数据库
> db.dropDatabase()
创建集合
> db.createCollection("集合名")
查询集合
> show collections
删除集合
> db.集合名.drop()
向集合中插入单个文档
db.ttttt.insert({title:"怪物猎人世界评测" ,"rank":2,"tag":"game"});
向集合comment中插入多文档,命令如下:
db.comment.insertMany([{document1},{document2},{document3}])
删除文档
(1)方式一,使用db.集合名.deleteMany({})
(2)方式二,使用db.集合名.remove({})
假如,假设要删除user集合中所有“username”为”foo”的文档:
db.user.remove({“username”:“foo”})
查询mydb全部文档
>db.mydb.find()
查找出某个字段值为空值的文档
1、db.user.find() 即查询user集合中的全部内容
2、db.user.find({“age”:18}) 查找所有的“age”的值为18的文档
3、db.user.find({“name”:“jack”}) 想匹配一个字符串,
“name”的值为“jack”的
4、db.user.find({“name”:“jack”,“age”:18})查询所有用户名为“jack”且年龄为18的用户
请查询出成绩为空值的学生信息;(5分)。
>db.students.find({score: {$in:[null],$exists:true}} )
如何查找出同时满足某几个条件的文档,并对结果字段进行选择性的显示。
请查询出计算机应用技术专业和软件技术专业成绩大于90分的女生姓名和专业;(6分) 指定键的值为0,不返回该键值对;为1时返回
db.students.find( { $or: [ {major:”XXX”, score:{$gt:90},sex: “female”}, {major:”YYY”, score:{$gt:90}, sex: “female”} ]}, {_id:0, name:1, major:1})
查询条件——比较操作符
$lt:小于(<)
$lte :小于等于(<=)
$gt :大于(>)
$gte :大于等于(>=)
$ne :不等于(≠)
查询user集合中:年龄在18到28的用户
命令:db.user.find({“age”:{“$gte”:18,“$lte”:28}})
按条件查询文档
使用“与”操作符,查询集合comment中同时满足userid为1005和nickname为罗密欧的文档,具体命令如下。
db.comment.find({$and:[{"userid":"1005","nickname":"罗密欧"}]}).pretty()
使用“或”操作符,查询集合comment中userid为1002或userid为1003的文档,具体命令如下。
db.comment.find({$or:[{"userid":"1002"},{"userid":"1003"}]}).pretty()
使用“包含”操作符,查询集合comment中_id包含1、3的文档,具体命令如下。
db.comment.find({"_id":{$in:["1","3"]}}).pretty()
使用“不包含”操作符,查询集合comment中_id不包含1、3、5的文档,具体命令
如下。
db.comment.find({"_id":{$nin:["1","3","5"]}}).pretty()
使用Null类型查询,查询集合comment中字段state为null的文档,具体命令如下。
db.comment.find({"state":null}).pretty()
使用正则表达式查询,查询集合comment中评论内容content值以“专家”开头的文档,具体命令如下。
db.comment.find({"content":/^专家/}).pretty()
使用精确查询,查询集合comment中包含子文档homePhone和mobilePhone且值分别为62771541、13262984142的文档,具体命令如下。
db.comment.find({"phone":{"homePhone":"62771541","mobilePhone":"13262984142"}}).pretty()
使用点查询,查询集合comment中包含子文档homePhone且值为82174911的文档,
具体命令如下。
db.comment.find({"phone.homePhone":"82174911"}).pretty()
1. 取出tag 为 game的文档; db.posts.find( {“tag”: “game”})
2. 取出排名 >= 4 的文档; db.posts.find( {“rank”: {$gte: 4} } )
3. 取出排名 < 4 的文档;db.ttttt.find({"rank":{$It:4}})
4. 取出文章标题中包含字母 u 的文档; db.ttttt.find({"title":/u/})
5. 取出 文章标题以字母 R 开头的文档;db.ttttt.find({"title":/^R/})
6. 查找一下文章有几种分类。db.ttttt.distinct("tag")
1.标题包含有字母 u, 并且排名大于5的文档 (用两种写法写出来)
db.ttttt.find({"title":/u/,"rank":{$gt:5}})
db.ttttt.find({$and:[{"title":/u/},{"rank":{$gt:5}}]})
2.标题包含有字母 u, 或者排名大于等于 4的文档
db.ttttt.find({$or:[{"title":/u/},{"rank":{$gte:4}}]})
3.排名=3,或者 排名=4 的文档(用两种方法写出来)
db.ttttt.find({$or:[{"rank":3},{"rank":4}]})
db.ttttt.find({"rank":{$in:[3,4]}})
4. 在集合中增加一条文档,现在我要把这个文档抽取出来
db.posts.insert({“title”:”惊!骑士发生重大交易”,“istop”:true})
db.posts.find({“istop”:{$exists:true}})
查询所有存在age 字段的记录:
db.users.find({age: {$exists: true}});
查询所有不存在name 字段的记录:
db.users.find({name: {$exists: false}});
1、每一个元素都是整个键(数组的键)的值
db.food.find({fruit:"banana"})
2、$all查询:需要多个元素来匹配数组时
如:要找到既有“apple”又有“banana”的文档
db.food.find({fruit:{$all:["banana","apple"]}})
3、使用key.index语法指定数组的下标进行精准查询
db.food.find({"fruit.2":"peach"})
4、$size查询:查询指定数组的大小的文档
db.food.find({"fruit":{"$size":3}})
1. 查询所有的文档,不显示id这个字段,按照rank的值进行降序排序。
db.ttttt.find({},{_id:0}).sort({rank:-1})
2. 查询所有的文档,不显示id这个字段,并且最后只显示前3条文档。
db.ttttt.find({},{_id:0}).limit(3)
3. 查询所有的文档,不显示id这个字段,按照rank的值进行降序排序,并且最后只显示前3条文档。
db.ttttt.find({},{_id:0}).sort({rank:-1}).limit(3)
4. 只查询出第一条数据,不显示id这个字段。(两种方法)
db.ttttt.find({},{_id:0}).limit(1)
db.ttttt.findOne({},{_id:0});
5. 分页:先按照默认顺序,抽出集合中前3条文档,然后再抽取剩下文档中的前3条文档进行显示。
db.ttttt.find().limit(3)
db.ttttt.find().skip(3).limit(3)
db.ttttt.find({tag:{$in:["game","it"]}})
db.ttttt.find({tag:{$nin:["game","it"]}})
db.ttttt.update{tag:game,{$set{rank:NumberInt(10)},{multi:ture}}
更新文档中state=1的文档当中的likenum=1000
db.ttttt.updata({state:”1”},{$set:{likenum:1000}},{multi:true})
将tag=it的文档中rank对应的值+1?
db.ttttt.update({tag:"it"},{$inc:{rank:1}},{multi:true})))
将怪物猎人这篇文章的rank变为10
db.ttttt.update({title:"怪物猎人世界评测"},{$set:{rank:10}})
更新tag=it的所有文档,将它们的rank设为60
db.ttttt.update({tag:"it"},{$set:{rank:60}},{multi:true})
将怪物猎人文档的rank*2
db.ttttt.update({title:"怪物猎人世界评测"},{$mul:{rank:2}})
将怪物猎人文档的rank改名为score
db.ttttt.update({title:"怪物猎人世界评测"},{$rename:{rank:"score"}})
在怪物猎人文档中插入字段”istop”:true
db.ttttt.update({title:"怪物猎人世界评测"},{$push:{istop:"true"}})
将字段”istop”:true删除
db.ttttt.update({title:"怪物猎人世界评测"},{$unset:{istop:true}})
如果 posts 集合中有 title 为“其实创造比大志好玩”这条文档,则更新这条文档的 rank 为 7,如果没有,则先插入以下这条文档,再将 rank 更新为 7
db.ttttt.update({title:"其实创造比大志好玩"},{title:"其实创造比大志好玩","rank":7,"tag":"game"},{upsert:true})
以上
编号、姓名、专业、学分、性别
id name major score sex
db.ttttt.find({sex:”m”},{$sum:score},{ multi:true })
聚合管道
db.tttt.aggregate([{$group:{_id:”$分组键名”,”$分组键名”,……,别名:{聚合运算:”$运算列”}}},{条件筛选:{键名:{运算条件:运算值}}}])
聚合语法
db.ttttt.aggregate([{$group:{_id:“$分组键名“,”$分组键名”,…….,别名:{聚合运算:”$运算列”}}},{条件筛选:{键名:{运算条件:运算值}}}])
管道操作:$group,$project,$match,$sort,$limit,$skip等
聚合运算符:$sum,$avg,$min,$max,$first,$last,$push等
比较运算符:$gt,$lt,$gte,$lte,$ne等
例:通过产品类型来进行分组,然后在统计卖出的数量
db.items.aggregate([{$group:{_id:"$pnumber",total:{$sum:"$quantity"}}}])
$project:显示结果的字段进行调整
例:只显示文档的quantity和pnumber字段
db.items.aggregate({$project:{"quantity":1,"price":0,"pnumber":1}})
$match:过滤输出条件
例:过滤出price大于4.0的所有文档
db.items.aggregate({$match:{price:{$gt:4.0}}})
$sort:结果排序
例:对price字段升序排列
db.items.aggregate({$sort:{price:1}})
$limit和$skip:限制显示结果,以及略过返回结果的前几项
例:返回item集合的前3项文档,并略过第1项
db.items.aggregate({$limit:3},{$skip:1}
• 1.查看posts集合中的所有索引;
• 2.以rank的降序来创建一个索引;
• 3.将刚才创建的索引删除掉;
• 4.以title的升序来创建一个唯一的索引,
• 5.取出当前posts集合中的所有文档;
• 6.添加一条文档,运行结果是?
- db.posts.getIndexes()
- db.posts.createIndex({rank:-1}
- db.posts.dropIndex(rank:1)
- db.posts.createIndex({title:1},{unique:ture})
- db.posts.find()
- db.posts.dropIndex(title:1) db.posts.insert()
在bin目录下cmd进入备份和还原
备份数据库
mongodump -h 127.0.0.1 -d tttt -o C:\data
还原数据库
mongorestore -d tttt F:/test/tttt