基于nosql数据库课程设计 nosql数据库期末题库答案_数据


mongodb

一、NoSQL 简介

NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

在现代的计算系统上每天网络上都会产生庞大的数据量。

这些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理。 1970年 E.F.Codd's提出的关系模型的论文 "A relational model of data for large shared data banks",这使得数据建模和应用程序编程更加简单。

通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。

NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

1.1 关系型数据库遵循ACID规则

事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:

1、A (Atomicity) 原子性

比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。

2、C (Consistency) 一致性

例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。

3、I (Isolation) 独立性

4、D (Durability) 持久性

1.2 分布式系统

分布式系统(distributed system)由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。

分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。

因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。

分布式系统可以应用在在不同的平台上如:Pc、工作站、局域网和广域网上等。

1.3 分布式计算的优点

可靠性(容错) :

可扩展性:

资源共享:

灵活性:

更快的速度:

开放系统:

更高的性能:

1.4分布式计算的缺点

故障排除: :

软件:

网络:

安全性:

什么是NoSQL?

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

为什么使用NoSQL ?

今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。

实例

社会化关系网:

Each record: UserID1, UserID2 Separate records: UserID, first_name,last_name, age, gender,... Task: Find all friends of friends of friends of ... friends of a given user.

Wikipedia 页面 :

Large collection of documents Combination of structured and unstructured data Task: Retrieve all pages regarding athletics of Summer Olympic before 1950.

RDBMS vs NoSQL

RDBMS

  • 高度组织化结构化数据
  • 结构化查询语言(SQL) (SQL)
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言,数据定义语言
  • 严格的一致性
  • 基础事务

NoSQL

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式 -键 - 值对存储,列存储,文档存储,图形数据库
  • 最终一致性,而非ACID属性
  • 非结构化和不可预知的数据
  • CAP定理
  • 高性能,高可用性和可伸缩性

NoSQL 简史

NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。

2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论[2],来自Rackspace的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。

2009年在亚特兰大举行的"no:sql(east)"讨论会是一个里程碑,其口号是"select fun, profit from real_world where relational=false;"。因此,对NoSQL最普遍的解释是"非关联型的",强调Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS。

CAP定理(CAP theorem)

在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer's theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分隔容忍(Partition tolerance)

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。
  • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

NoSQL的优点/缺点

优点:

  • - 高可扩展性
  • - 分布式计算
  • - 低成本
  • - 架构的灵活性,半结构化数据
  • - 没有复杂的关系

缺点:

  • - 没有标准化
  • - 有限的查询功能(到目前为止)
  • - 最终一致是不直观的程序

BASE

BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定义。

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:

  • Basically Availble --基本可用
  • Soft-state --软状态/柔性事务。 "Soft state" 可以理解为"无连接"的, 而 "Hard state" 是"面向连接"的
  • Eventual Consistency --最终一致性 最终一致性, 也是是 ACID 的最终目的。

ACID vs BASE

ACIDBASE原子性(Atomicity)基本可用(Basically Available)一致性(Consistency)软状态/柔性事务(Soft state)隔离性(Isolation)最终一致性 (Eventual consistency)持久性 (Durable)

NoSQL 数据库分类

类型部分代表特点列存储HbaseCassandraHypertable顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。文档存储MongoDBCouchDB文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。key-value存储Tokyo Cabinet / TyrantBerkeley DBMemcacheDBRedis可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)图存储Neo4JFlockDB图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。对象存储db4oVersant通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。xml数据库Berkeley DB XMLBaseX高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

二、MongoDB 概念解析

不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。

下表将帮助您更容易理解Mongo中的一些概念:

SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引table joins表连接,MongoDB不支持primary keyprimary key主键,MongoDB自动将_id字段设置为主键

通过下图实例,我们也可以更直观的的了解Mongo中的一些概念:


基于nosql数据库课程设计 nosql数据库期末题库答案_基于nosql数据库课程设计_02


2.1 数据库

一个mongodb中可以建立多个数据库。

MongoDB的默认数据库为"db",该数据库存储在data目录中。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

"show dbs"


$ ./mongo  MongoDB shell version: 3.0.6  connecting to: test  > show dbs  local  0.078GB  test   0.078GB  >


执行 "db"


$ ./mongo  MongoDB shell version: 3.0.6  connecting to: test  > db  test  >


运行"use"命令,可以连接到一个指定的数据库。


> use local  switched to db local  > db  local  >


以上实例命令中,"local" 是你要链接的数据库。

在下一个章节我们将详细讲解MongoDB中命令的使用。

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。

  • 不能是空字符串("")。
  • 不得含有' '(空格)、.、$、/、和0 (空宇符)。
  • 应全部小写。
  • 最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

  • admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local:
  • config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

2.2 文档

文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

一个简单的文档例子如下:


{"site":"www.runoob.com", "name":"菜鸟教程"}


下表列出了 RDBMS 与 MongoDB 对应的术语:


基于nosql数据库课程设计 nosql数据库期末题库答案_数据库_03


需要注意的是:

  1. 文档中的键/值对是有序的。
  2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  3. MongoDB区分类型和大小写。
  4. MongoDB的文档不能有重复的键。
  5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

  • 键不能含有0 (空字符)。这个字符用来表示键的结尾。
  • .和$有特别的意义,只有在特定环境下才能使用。
  • 以下划线"_"开头的键是保留的(不是严格要求的)。

2.3 集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

比如,我们可以将以下不同数据结构的文档插入到集合中:


{"site":"www.baidu.com"}  {"site":"www.google.com","name":"Google"}  {"site":"www.runoob.com","name":"菜鸟教程","num":5}


当第一个文档插入时,集合就会被创建。

合法的集合名

  • 集合名不能是空字符串""。
  • 集合名不能含有0字符(空字符),这个字符表示集合名的结尾。
  • 集合名不能以"system."开头,这是为系统集合保留的前缀。
  • 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。 

如下实例:


db.col.findOne()


capped collections

Capped collections 就是固定大小的collection。

它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。

Capped collections是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能 和标准的collection不同,你必须要显式的创建一个capped collection, 指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的。

要注意的是指定的存储大小包含了数据库的头信息。


db.createCollection("mycoll", {capped:true, size:100000})


  • 在capped collection中,你能添加新的对象。
  • 能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。
  • 数据库不允许进行删除。使用drop()方法删除collection所有的行。
  • 注意: 删除之后,你必须显式的重新创建这个collection。
  • 在32bit机器中,capped collection最大存储为1e9( 1X109)个字节。

2.4 元数据

数据库的信息是存储在集合中。它们使用了系统的命名空间:


dbname.system.*


在MongoDB数据库中名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection),如下:


基于nosql数据库课程设计 nosql数据库期末题库答案_分布式计算_04


对于修改系统集合中的对象有如下限制。

在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。

{{system.users}}是可修改的。 {{system.profile}}是可删除的。

2.5 MongoDB 数据类型

下表为MongoDB中常用的几种数据类型。


基于nosql数据库课程设计 nosql数据库期末题库答案_数据库_05


三、什么是MongoDB ?

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。


基于nosql数据库课程设计 nosql数据库期末题库答案_mongodb连接失败_06


主要特点

  • MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单。

历史 2007年10月,MongoDB由10gen团队所发展。2009年2月首度推出。

  • 2012年05月23日,MongoDB2.1 开发分支发布了! 该版本采用全新架构,包含诸多增强。
  • 2012年06月06日,MongoDB 2.0.6 发布,分布式文档数据库。
  • 2013年04月23日,MongoDB 2.4.3 发布,此版本包括了一些性能优化,功能增强以及bug修复。
  • 2013年08月20日,MongoDB 2.4.6 发布,是目前最新的稳定版。

MongoDB 下载

你可以在mongodb官网下载该安装包,地址为: http://www.mongodb.org/downloads。MonggoDB支持以下平台:

  • OS X 32-bit
  • OS X 64-bit
  • Linux 32-bit
  • Linux 64-bit
  • Windows 32-bit
  • Windows 64-bit
  • Solaris i86pc
  • Solaris 64

MongoDB 工具

有几种可用于MongoDB的管理工具。

监控

MongoDB提供了网络和系统监控工具Munin,它作为一个插件应用于MongoDB中。

Gangila是MongoDB高性能的系统监视的工具,它作为一个插件应用于MongoDB中。

基于图形界面的开源工具 Cacti, 用于查看CPU负载, 网络带宽利用率,它也提供了一个应用于监控 MongoDB 的插件。

GUI

  • Fang of Mongo – 网页式,由Django和jQuery所构成。
  • Futon4Mongo – 一个CouchDB Futon web的mongodb山寨版。
  • Mongo3 – Ruby写成。
  • MongoHub – 适用于OSX的应用程序。
  • Opricot – 一个基于浏览器的MongoDB控制台, 由PHP撰写而成。
  • Database Master — Windows的mongodb管理工具
  • RockMongo — 最好的PHP语言的MongoDB管理工具,轻量级, 支持多国语言.

MongoDB 应用案例

下面列举一些公司MongoDB的实际应用:

  • Craiglist上使用MongoDB的存档数十亿条记录。
  • FourSquare,基于位置的社交网站,在Amazon EC2的服务器上使用MongoDB分享数据。
  • Shutterfly,以互联网为基础的社会和个人出版服务,使用MongoDB的各种持久性数据存储的要求。
  • bit.ly, 一个基于Web的网址缩短服务,使用MongoDB的存储自己的数据。
  • http://spike.com,一个MTV网络的联营公司, http://spike.com使用MongoDB的。
  • Intuit公司,一个为小企业和个人的软件和服务提供商,为小型企业使用MongoDB的跟踪用户的数据。
  • http://sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储。
  • http://etsy.com ,一个购买和出售手工制作物品网站,使用MongoDB。
  • 纽约时报,领先的在线新闻门户网站之一,使用MongoDB。
  • CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB。

四、MongoDB的安装

4.1 window平台安装 MongoDB

MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center#community

注意:在 MongoDB 2.2 版本后已经不再支持 Windows XP 系统。最新版本也已经没有了 32 位系统的安装文件。


基于nosql数据库课程设计 nosql数据库期末题库答案_数据_07


  • MongoDB for Windows 64-bit
  • MongoDB for Windows 32-bit
  • MongoDB for Windows 64-bit Legacy

根据你的系统下载 32 位或 64 位的 .msi 文件,下载后双击该文件,按操作提示安装即可。

安装过程中,你可以通过点击 "Custom(自定义)" 按钮来设置你的安装目录。


基于nosql数据库课程设计 nosql数据库期末题库答案_分布式计算_08


基于nosql数据库课程设计 nosql数据库期末题库答案_数据_09


下一步安装 "install mongoDB compass"


基于nosql数据库课程设计 nosql数据库期末题库答案_mongodb连接失败_10


创建数据目录

MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。请注意,数据目录应该放在根目录下((如: C: 或者 D: 等 )。

在本教程中,我们已经在 C 盘安装了 mongodb,现在让我们创建一个 data 的目录然后在 data 目录里创建 db 目录。


c:>cd c:

c:>mkdir data

c:>cd data

c:data>mkdir db

c:data>cd db

c:datadb>


你也可以通过 window 的资源管理器中创建这些目录,而不一定通过命令行。

4.1.1 命令行下运行 MongoDB 服务器

为了从命令提示符下运行 MongoDB 服务器,你必须从 MongoDB 目录的 bin 目录中执行 mongod.exe 文件。


C:mongodbbinmongod --dbpath c:datadb


如果执行成功,会输出如下信息:


2015-09-25T15:54:09.212+0800 I CONTROL  Hotfix KB2731284 or later update is not
installed, will zero-out data files
2015-09-25T15:54:09.229+0800 I JOURNAL  [initandlisten] journal dir=c:datadbj
ournal
2015-09-25T15:54:09.237+0800 I JOURNAL  [initandlisten] recover : no journal fil
es present, no recovery needed
2015-09-25T15:54:09.290+0800 I JOURNAL  [durability] Durability thread started
2015-09-25T15:54:09.294+0800 I CONTROL  [initandlisten] MongoDB starting : pid=2
488 port=27017 dbpath=c:datadb 64-bit host=WIN-1VONBJOCE88
2015-09-25T15:54:09.296+0800 I CONTROL  [initandlisten] targetMinOS: Windows 7/W
indows Server 2008 R2
2015-09-25T15:54:09.298+0800 I CONTROL  [initandlisten] db version v3.0.6
……


4.1.2 连接MongoDB

我们可以在命令窗口中运行 mongo.exe 命令即可连接上 MongoDB,执行如下命令:


C:mongodbbinmongo.exe


4.1.3 配置 MongoDB 服务

管理员模式打开命令行窗口

创建目录,执行下面的语句来创建数据库和日志文件的目录


mkdir c:datadb
mkdir c:datalog


创建配置文件

创建一个配置文件。该文件必须设置 systemLog.path 参数,包括一些附加的配置选项更好。

例如,创建一个配置文件位于 C:mongodbmongod.cfg,其中指定 systemLog.path 和 storage.dbPath。具体配置内容如下:


systemLog:
    destination: file
    path: c:datalogmongod.log
storage:
    dbPath: c:datadb


4.1.4 安装 MongoDB服务

通过执行mongod.exe,使用--install选项来安装服务,使用--config选项来指定之前创建的配置文件。


C:mongodbbinmongod.exe --config "C:mongodbmongod.cfg" --install


要使用备用 dbpath,可以在配置文件(例如:C:mongodbmongod.cfg)或命令行中通过 --dbpath 选项指定。

如果需要,您可以安装 mongod.exe 或 mongos.exe 的多个实例的服务。只需要通过使用 --serviceName 和 --serviceDisplayName 指定不同的实例名。只有当存在足够的系统资源和系统的设计需要这么做。

启动MongoDB服务


net start MongoDB


关闭MongoDB服务


net stop MongoDB


移除 MongoDB 服务


C:mongodbbinmongod.exe --remove


命令行下运行 MongoDB 服务器配置 MongoDB 服务

任选一个操作就好

4.1.5 MongoDB 后台管理 Shell

如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo.exe文件,MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。

当你进入mongoDB后台后,它默认会链接到 test 文档(数据库):


> mongo
MongoDB shell version: 3.0.6
connecting to: test
……


由于它是一个JavaScript shell,您可以运行一些简单的算术运算:


> 2 + 2
4
>


db


> db
test
>


插入一些简单的记录并查找它:


> db.runoob.insert({x:10})
WriteResult({ "nInserted" : 1 })
> db.runoob.find()
{ "_id" : ObjectId("5604ff74a274a611b0c990aa"), "x" : 10 }
>


第一个命令将数字 10 插入到 runoob 集合的 x 字段中。

4.2 Linux平台安装MongoDB

MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包。

下载地址:https://www.mongodb.com/download-center#community


基于nosql数据库课程设计 nosql数据库期末题库答案_mongodb连接失败_11


下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装) 。


curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz    # 下载
tar -zxvf mongodb-linux-x86_64-3.0.6.tgz                                   # 解压

mv  mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb                         # 将解压包拷贝到指定目录


MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH


export PATH=<mongodb-install-directory>/bin:$PATH


<mongodb-install-directory> 为你 MongoDB 的安装路径。如本文的 /usr/local/mongodb

4.2.1 创建数据库目录

MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。

以下实例中我们将data目录创建于根目录下(/)。

注意:/data/db 是 MongoDB 默认的启动的数据库路径(--dbpath)。


mkdir -p /data/db


4.2.2 命令行中运行 MongoDB 服务

你可以再命令行中执行mongo安装目录中的bin目录执行mongod命令来启动mongdb服务。

注意:如果你的数据库目录不是/data/db,可以通过 --dbpath 来指定。


$ ./mongod
2015-09-25T16:39:50.549+0800 I JOURNAL  [initandlisten] journal dir=/data/db/journal
2015-09-25T16:39:50.550+0800 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed
2015-09-25T16:39:50.869+0800 I JOURNAL  [initandlisten] preallocateIsFaster=true 3.16
2015-09-25T16:39:51.206+0800 I JOURNAL  [initandlisten] preallocateIsFaster=true 3.52
2015-09-25T16:39:52.775+0800 I JOURNAL  [initandlisten] preallocateIsFaster=true 7.7


4.2.3 MongoDB后台管理 Shell

如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo命令文件。

MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。

当你进入mongoDB后台后,它默认会链接到 test 文档(数据库):


$ cd /usr/local/mongodb/bin
$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
Welcome to the MongoDB shell.
……


由于它是一个JavaScript shell,您可以运行一些简单的算术运算:


> 2+2
4
> 3+6
9


现在让我们插入一些简单的数据,并对插入的数据进行检索:


> db.runoob.insert({x:10})
WriteResult({ "nInserted" : 1 })
> db.runoob.find()
{ "_id" : ObjectId("5604ff74a274a611b0c990aa"), "x" : 10 }
>


第一个命令将数字 10 插入到 runoob 集合的 x 字段中。

4.2.4 MongoDb web 用户界面

MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 --rest 。

注意:该功能只适用于 MongoDB 3.2 及之前的早期版本。


$ ./mongod --dbpath=/data/db --rest


MongoDB 的 Web 界面访问端口比服务的端口多1000。

如果你的MongoDB运行端口使用默认的27017,你可以在端口号为28017访问web用户界面,即地址为:http://localhost:28017。


基于nosql数据库课程设计 nosql数据库期末题库答案_分布式计算_12


五、启动Mongodb服务

你的安装目录/bin下,有一个叫mongod.exe的应用程序,这个程序就是用来启动你的mongodb服务器的。

创建数据库目录

在你想要存放数据的地方,新建一个文件夹,如db,我们推荐的数据库目录设置是:


data/	conf	-->配置文件目录		mongod.conf		-->配置文件	db		-->数据库目录	log		-->日志文件目录		mongodb.log		-->日志记录文件


启动数据库

我本地是window10环境,我的mongodb服务安装在F盘的mongodb文件夹。我的数据目录在Fdata文件夹。

启动doc命令,输入一下命令:


F:>mongodb/bin
F:mongodbbin>mongod --path=/data/db


输出以下信息:

最后一行显示"waiting for connections on port 27017",表明mongodb服务器已经启动,正在27017窗口等待连接。

再查看f:/data/db文件夹,已出现以下文件:


基于nosql数据库课程设计 nosql数据库期末题库答案_数据_13


说明mongodb服务启动成功。

将MongoDB服务器作为Windows服务运行

像上面那样启动mongodb,发现没办法输入命令行了,这是可以采用打开多个窗口来连接,但这样就太麻烦了,解决办法就是将MongoDB服务器作为Windows服务运行。

输入以下命令:


F:mongodbbin>mongod --dbpath "f:datadb" --logpath "f:datalogmongodb.log" --serviceName "mongodb" --serviceDisplayName "mongodb" --install


看到了如下输出:


2016-10-20T23:32:46.339+0800 I CONTROL  log file "f:datalogmongodb.log" exists; moved to "f:datalogmongodb.log.2016-10-20T15-32-46".


说明mongodb服务安装成功。启动mongodb服务:


F:mongodbbin>net start mongodb 

MongoDB 服务已经启动成功。


说明mongodb启动成功。

由于我们并没有指定mongodb服务的端口号,所以它启动在默认的27017窗口。

打开浏览器,范围地址http://127.0.0.1:27017/,可看到如下信息


It looks like you are trying to access MongoDB over HTTP on the native driver port.


mongodb常用启动参数

mongod.exe常用参数如下:


基于nosql数据库课程设计 nosql数据库期末题库答案_分布式计算_14


mongod.exe的启动参数,在window环境下和linux环境下并不相同,详见mongod - mongodb启动服务工具。

六、MongoDB - 连接

6.1 启动 MongoDB服务

在前面的教程中,我们已经讨论了如何启动MongoDB服务,你只需要在MongoDB安装目录的bin目录下执行'mongod'即可。

执行启动操作后,mongodb在输出一些必要信息后不会输出任何信息,之后就等待连接的建立,当连接被建立后,就会开始打印日志信息。

你可以使用 MongoDB shell 来连接 MongoDB 服务器。你也可以使用 PHP 来连接 MongoDB。本教程我们会使用 MongoDB shell 来连接 Mongodb 服务,之后的章节我们将会介绍如何通过php 来连接MongoDB服务。

6.2 通过shell连接MongoDB服务

你可以通过执行以下命令来连接MongoDB的服务。

注意:localhost为主机名,这个选项是必须的:

mongodb://localhost

当你执行以上命令时,你可以看到以下输出结果:


$ ./mongo  MongoDB shell version: 3.0.6  connecting to: test  > mongodb://localhostmongodb://localhost  ...


这时候你返回查看运行 ./mongod


……省略信息……  2015-09-25T17:22:27.336+0800 I CONTROL  [initandlisten] allocator: tcmalloc  2015-09-25T17:22:27.336+0800 I CONTROL  [initandlisten] options: { storage: { dbPath: "/data/db" } }  2015-09-25T17:22:27.350+0800 I NETWORK  [initandlisten] waiting for connections on port 27017  2015-09-25T17:22:36.012+0800 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:37310 #1 (1 connection now open)  # 该行表明一个来自本机的连接    ……省略信息……


6.3 MongoDB连接命令格式

使用用户名和密码连接到MongoDB服务器,你必须使用 'username:password@hostname/dbname' 格式,'username'为用户名,'password' 为密码。

使用用户名和密码连接登陆到默认数据库:


$ ./mongo  MongoDB shell version: 3.0.6  connecting to: test  mongodb://admin:123456@localhost/


以上命令中,用户 admin 使用密码 123456 连接到本地的 MongoDB 服务上。输出结果如下所示:<、p>


> mongodb://admin:123456@localhost/  ...


使用用户名和密码连接登陆到指定数据库:

连接到指定数据库的格式如下:

mongodb://admin:123456@localhost/test

6.4 更多连接实例

连接本地数据库服务器,端口是默认的。

mongodb://localhost

使用用户名fred,密码foobar登录localhost的admin数据库。

mongodb://fred:foobar@localhost

使用用户名fred,密码foobar登录localhost的baz数据库。

mongodb://fred:foobar@localhost/baz

连接 replica pair, 服务器1为http://example1.com服务器2为example2。

mongodb://example1.com:27017,http://example2.com:27017

连接 replica set 三台服务器 (端口 27017, 27018, 和27019):

mongodb://localhost,localhost:27018,localhost:27019

连接 replica set 三台服务器, 写入操作应用在主服务器 并且分布查询到从服务器。

mongodb://host1,host2,host3/?slaveOk=true

直接连接第一个服务器,无论是replica set一部分或者主服务器或者从服务器。

mongodb://host1,host2,host3/?connect=direct;slaveOk=true

当你的连接服务器有优先级,还需要列出所有服务器,你可以使用上述连接方式。

安全模式连接到localhost:

mongodb://localhost/?safe=true

以安全模式连接到replica set,并且等待至少两个复制服务器成功写入,超时时间设置为2秒。

mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000

6.5 参数选项说明

标准格式:

mongodb://[username:password@]host1:port1,...,hostN[:portN]][?options]]

标准的连接格式包含了多个选项(options),如下所示:


基于nosql数据库课程设计 nosql数据库期末题库答案_数据库_15


七、Mongodb的使用

7.1 MongoDB 创建数据库

MongoDB 创建数据库的语法格式如下:


use DATABASE_NAME


如果数据库不存在,则创建数据库,否则切换到指定数据库。

以下实例我们创建了数据库 mongo:


> use mongo  
switched to db mongo  
> db 
mongo 
>


如果你想查看所有数据库,可以使用 show dbs


> show dbs  
local  0.078GB  
test   0.078GB  
>


可以看到,我们刚创建的数据库 mongo 并不在数据库的列表中, 要显示它,我们需要向 mongo 数据库插入一些数据。


> db.mongo.insert({"name":"mongodb中文网"})
WriteResult({ "nInserted" : 1 })  
> show dbs  
local   0.078GB  
mongo  0.078GB 
test    0.078GB  
>


MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。

7.2 MongoDB 删除数据库

MongoDB 删除数据库的语法格式如下:


db.dropDatabase()


删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。

以下实例我们删除了数据库 mongo。

首先,查看所有数据库:


> show dbs  
local   0.078GB  
mongo   0.078GB  
test    0.078GB


接下来我们切换到数据库 mongo


> use runoob  switched to db mongo  >


执行删除命令:


> db.dropDatabase()  { "dropped" : "runoob", "ok" : 1 }


最后,我们再通过 show dbs 命令数据库是否删除成功:


> show dbs  
local  0.078GB  
test   0.078GB  
>


集合删除语法格式如下:


db.collection.drop()


7.3 MongoDB 插入文档

插入文档

MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:


db.COLLECTION_NAME.insert(document)


实例

以下文档可以存储在 MongoDB 的 mongo 数据库 的 col集合中:


>db.col.insert({title: 'MongoDB 教程',	
		description: 'MongoDB 是一个 Nosql 数据库',	
		by: 'MongoDB中文网', 	
		url: 'http://www.mongodb.org.cn', 	
		tags: ['mongodb', 'database', 'NoSQL'],	
		likes: 100  
})


以上实例中 col 是我们的集合名,前一章节我们已经创建过了,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

查看已插入文档:


> db.col.find()  
{ 	
		"_id" : ObjectId("56064886ade2f21f36b03134"),	
		"title" : "MongoDB 教程",	
		"description" : "MongoDB 是一个 Nosql 数据库",	
		"by" : "MongoDB中文网",	
		"url" : "http://www.mongodb.org.cn",	
		"tags" : [ "mongodb", "database", "NoSQL" ],	
		"likes" : 100 
}
>


我们也可以将数据定义为一个变量,如下所示:


> document=({title: 'MongoDB 教程',
            description: 'MongoDB 是一个 Nosql 数据库',   
            by: 'Mongodb中文网',       
            url: 'http://www.mongodb.org.cn',   
            tags: ['mongodb', 'database', 'NoSQL'],     
            likes: 100  
});


执行后显示结果如下:


{           
            "title" : "MongoDB 教程",     
            "description" : "MongoDB 是一个 Nosql 数据库",    
            "by" : "Mongodb中文网",            
            "url" : "http://www.mongodb.org.cn",    
            "tags" : [                      
                    "mongodb",                  
                    "database",             
                    "NoSQL"         
            ],          
            "likes" : 100  
}


执行插入操作:


> db.col.insert(document)  WriteResult({ "nInserted" : 1 })  >


插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。

7.4 MongoDB 删除文档

语法

remove() 方法的基本语法格式如下所示:


db.collection.remove(   
        <query>,        
        <justOne> 
)


如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:


db.collection.remove(       
        <query>,        
        {               
                justOne: <boolean>,     
                writeConcern: <document>    
        } 
)


参数说明:

  • query
  • justOne
  • writeConcern

实例

以下文档我们执行两次插入操作:


>db.col.insert({title: 'MongoDB 教程', 	
		description: 'MongoDB 是一个 Nosql 数据库', 	
		by: 'MongoDB中文网',   	
		url: 'http://www.mongodb.org.cn', 	
		tags: ['mongodb', 'database', 'NoSQL'], 	
		likes: 100 
})


使用 find() 函数查询数据:


> db.col.find()  
{ "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "MongoDB中文网", "url" : "http://www.mongodb.org.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }  
{ "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "MongoDB中文网", "url" : "http://www.mongodb.org.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }


接下来我们移除 title 为 'MongoDB 教程' 的文档:


>db.col.remove({'title':'MongoDB 教程'})  WriteResult({ "nRemoved" : 2 })           
  # 删除了两条数据  >db.col.find()  ……                                        # 没有数据


如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:


>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)


如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):


>db.col.remove({})  
>db.col.find()  
>


7.5 MongoDB 更新文档

update() 方法

update() 方法用于更新已存在的文档。语法格式如下:


db.collection.update(       
            <query>,    
            <update>,   
            {               
                    upsert: <boolean>,          
                    multi: <boolean>,       
                    writeConcern: <document>    
            }
)


参数说明:

  • query
  • update
  • upsert
  • multi
  • writeConcern

实例

我们在集合 col 中插入如下数据:


>db.col.insert({  	
		title: 'Mongodb 教程',  	
		description: 'MongoDB 是一个 Nosql 数据库',   	
		by: 'Mongodb中文网',   	
		url: 'http://www.mongodb.org.cn',   	
		tags: ['mongodb', 'database', 'NoSQL'],  	likes: 100  

})


接着我们通过 update() 方法来更新标题(title):


>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 输出信息  
> db.col.find().pretty()  
{         	
		"_id" : ObjectId("56064f89ade2f21f36b03136"),  	
		"title" : "MongoDB",   	
		"description" : "MongoDB 是一个 Nosql 数据库",  	
		"by" : "Mongodb中文网",      	
		"url" : "http://www.mongodb.org.cn", 	
		"tags" : [   		
					"mongodb",   		
					"database",   		
					"NoSQL"      	
		],      	
		"likes" : 100  
}  
>


可以看到标题(title)由原来的 "MongoDB 教程" 更新为了 "MongoDB"。

以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。


>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})


save() 方法

save() 方法通过传入的文档来替换已有文档。语法格式如下:


db.collection.save(    	
			<document>,     	
			{      		writeConcern: <document> 	
			}  
)


参数说明:

  • document
  • writeConcern

实例

以下实例中我们替换了 _id 为 56064f89ade2f21f36b03136 的文档数据:


>db.col.save({  		
		"_id" : ObjectId("56064f89ade2f21f36b03136"),   	
		"title" : "MongoDB",  	
		"description" : "MongoDB 是一个 Nosql 数据库",	
		"by" : "MongoDB中文网",   	
		"url" : "http://www.mongodb.org.cn",     	
		"tags" : [           		
				"mongodb",       		
				"NoSQL"    	
		],    	
		"likes" : 110	
		}
)


替换成功后,我们可以通过 find() 命令来查看替换后的数据


>db.col.find().pretty()
{          	
		"_id" : ObjectId("56064f89ade2f21f36b03136"),  	
		"title" : "MongoDB",   	
		"description" : "MongoDB 是一个 Nosql 数据库", 	
		"by" : "Mongo",         	
		"url" : "http://www.mongodb.org.cn",   	
		"tags" : [                		
					"mongodb",      		
					"NoSQL"        	
		],      	
		"likes" : 110 
}  
>


更多实例

只更新第一条记录:


db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );


全部更新:


db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );


只添加第一条:


db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );


全部添加加进去:


db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );


全部更新:


db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );


只更新第一条记录:


db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );


更多mongodb操作查看 https://www.mongodb.org.cn/manual/>

7.6 MongoDB 查询文档

MongoDB 查询文档使用 find() 方法。

find() 方法以非结构化的方式来显示所有文档。

语法

MongoDB 查询数据的语法格式如下:


db.collection.find(query, projection)


  • query
  • projection

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:


>db.col.find().pretty()


pretty() 方法以格式化的方式来显示所有文档。

实例

以下实例我们查询了集合 col 中的数据:


> db.col.find().pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "菜鸟教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}


除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

7.6.1 MongoDB 与 RDBMS Where 语句比较

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:


基于nosql数据库课程设计 nosql数据库期末题库答案_mongodb连接失败_16


7.6.2 MongoDB AND 条件

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。

语法格式如下:


>db.col.find({key1:value1, key2:value2}).pretty()


实例

以下实例通过 bytitle 键来查询 菜鸟教程MongoDB 教程


> db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "菜鸟教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}


以上实例中类似于 WHERE 语句:WHERE by='菜鸟教程' AND title='MongoDB 教程'

7.6.3 MongoDB OR 条件

MongoDB OR 条件语句使用了关键字 $or,语法格式如下:


>db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()


实例

以下实例中,我们演示了查询键 by 值为 菜鸟教程 或键 title 值为 MongoDB 教程


>db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "菜鸟教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}
>


AND 和 OR 联合使用

以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: 'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')'


>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "菜鸟教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}


7.7 MongoDB 条件操作符

描述

条件操作符用于比较两个表达式并从mongoDB集合中获取数据。

在本章节中,我们将讨论如何在MongoDB中使用条件操作符。

MongoDB中条件操作符有:

  • (>) 大于 - $gt
  • (<) 小于 - $lt
  • (>=) 大于等于 - $gte
  • (<= ) 小于等于 - $lte

我们使用的数据库名称为"runoob" 我们的集合名称为"col",以下为我们插入的数据。

为了方便测试,我们可以先使用以下命令清空集合 "col" 的数据:


db.col.remove({})


插入以下数据


>db.col.insert({
    title: 'PHP 教程', 
    description: 'PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['php'],
    likes: 200
})
>db.col.insert({title: 'Java 教程', 
    description: 'Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['java'],
    likes: 150
})
>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb'],
    likes: 100
})


使用find()命令查看数据:


> db.col.find()
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }


7.7.1 MongoDB (>) 大于操作符 - $gt

如果你想获取 "col" 集合中 "likes" 大于 100 的数据,你可以使用以下命令:


db.col.find({likes : {$gt : 100}})


类似于SQL语句:


Select * from col where likes > 100;


输出结果:


> db.col.find({likes : {$gt : 100}})
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
>


7.7.2 MongoDB(>=)大于等于操作符 - $gte

如果你想获取"col"集合中 "likes" 大于等于 100 的数据,你可以使用以下命令:


db.col.find({likes : {$gte : 100}})


类似于SQL语句:


Select * from col where likes >=100;


输出结果:


> db.col.find({likes : {$gte : 100}})
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
>


7.7.3 MongoDB (<) 小于操作符 - $lt

如果你想获取"col"集合中 "likes" 小于 150 的数据,你可以使用以下命令:


db.col.find({likes : {$lt : 150}})


类似于SQL语句:


Select * from col where likes < 150;


输出结果:


> db.col.find({likes : {$lt : 150}})
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }


7.7.4 MongoDB (<=) 小于等于操作符 - $lte

如果你想获取"col"集合中 "likes" 小于等于 150 的数据,你可以使用以下命令:


db.col.find({likes : {$lte : 150}})


类似于SQL语句:


Select * from col where likes <= 150;


输出结果:


> db.col.find({likes : {$lte : 150}})
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }


7.7.5 MongoDB 使用 (<) 和 (>) 查询 - $lt 和 $gt

如果你想获取"col"集合中 "likes" 大于100,小于 200 的数据,你可以使用以下命令:


db.col.find({likes : {$lt :200, $gt : 100}})


类似于SQL语句:


Select * from col where likes>100 AND  likes<200;


输出结果:


> db.col.find({likes : {$lt :200, $gt : 100}})
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
>


7.8 MongoDB $type 操作符

描述

在本章节中,我们将继续讨论MongoDB中条件操作符 $type。

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

MongoDB 中可以使用的类型如下表所示:


基于nosql数据库课程设计 nosql数据库期末题库答案_分布式计算_17


我们使用的数据库名称为"runoob" 我们的集合名称为"col",以下为我们插入的数据。

简单的集合"col":


>db.col.insert({
    title: 'PHP 教程', 
    description: 'PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['php'],
    likes: 200
})
>db.col.insert({title: 'Java 教程', 
    description: 'Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['java'],
    likes: 150
})
>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: '菜鸟教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb'],
    likes: 100
})


使用find()命令查看数据:


> db.col.find()
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }


MongoDB 操作符 - $type 实例

如果想获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令:


db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})


输出结果为:


{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }


7.9 MongoDB Limit与Skip方法

7.9.1 MongoDB Limit() 方法

如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。

语法

limit()方法基本语法如下所示:


>db.COLLECTION_NAME.find().limit(NUMBER)


实例

集合 col 中的数据如下:


{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }


以下实例为显示查询文档中的两条记录:


> db.col.find({},{"title":1,_id:0}).limit(2)
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
>


注:如果你们没有指定limit()方法中的参数则显示集合中的所有数据。

7.9.2 MongoDB Skip() 方法

我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

语法

skip() 方法脚本语法格式如下:


>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)


实例

以下实例只会显示第二条文档数据


>db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
{ "title" : "Java 教程" }
>


注:skip()方法默认参数为 0 。

8.0 MongoDB 排序

MongoDB sort() 方法

在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

语法

sort()方法基本语法如下所示:


>db.COLLECTION_NAME.find().sort({KEY:1})


实例

col 集合中的数据如下:


{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }


以下实例演示了 col 集合中的数据按字段 likes 的降序排列:


>db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
{ "title" : "PHP 教程" }
{ "title" : "Java 教程" }
{ "title" : "MongoDB 教程" }
>


八、 MongoDB 之spring-mvc整合

参考文章

九、 MongoDB 之springboot整合

9.1 导入依赖


<dependencies>
    <!--spring-boot起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <!--实体-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.18</version>
    </dependency>
</dependencies>


9.2 配置文件


spring.application.name=mongodb_demo
server.port=8080


spring.data.mongodb.uri=mongodb://localhost:27017/test


9.3 DAO层


package com.hellojava.dao;



import com.hellojava.model.MongoTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;

@Component
public class MongoTestDao {


    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 创建对象
     */
    public void saveTest(MongoTest test) {
        mongoTemplate.save(test);
    }

    /**
     * 根据用户名查询对象
     * @return
     */
    public MongoTest findTestByName(String name) {
        Query query=new Query(Criteria.where("name").is(name));
        MongoTest mgt =  mongoTemplate.findOne(query , MongoTest.class);
        return mgt;
    }

    /**
     * 更新对象
     */
    public void updateTest(MongoTest test) {
        Query query=new Query(Criteria.where("id").is(test.getId()));
        Update update= new Update().set("age", test.getAge()).set("name", test.getName());
        //更新查询返回结果集的第一条
        mongoTemplate.updateFirst(query,update,MongoTest.class);
        //更新查询返回结果集的所有
        // mongoTemplate.updateMulti(query,update,TestEntity.class);
    }

    /**
     * 删除对象
     * @param id
     */
    public void deleteTestById(Integer id) {
        Query query=new Query(Criteria.where("id").is(id));
        mongoTemplate.remove(query,MongoTest.class);
    }
}