MongoDB - 快速指南


MongoDB - 概述

MongoDB 是一个跨平台、面向文档的数据库,提供高性能、高可用性和易于扩展性。MongoDB 致力于集合和文档的概念。

数据库

数据库是集合的物理容器。每个数据库在文件系统上都有自己的文件集。单个 MongoDB 服务器通常有多个数据库。

收藏

集合是一组 MongoDB 文档。它相当于 RDBMS 表。集合存在于单个数据库中。集合不强制执行模式。集合中的文档可以有不同的字段。通常,集合中的所有文档都具有相似或相关的目的。

文档

文档是一组键值对。文档具有动态架构。动态模式意味着同一集合中的文档不需要具有相同的字段或结构集,并且集合文档中的公共字段可以保存不同类型的数据。

下表显示了 RDBMS 术语与 MongoDB 的关系。

关系型数据库管理系统 MongoDB
数据库 数据库
桌子 收藏
元组/行 文档
柱子 场地
表连接 嵌入文档
首要的关键 主键(默认key_id由mongodb自己提供)
数据库服务器和客户端
mysqld/Oracle 蒙戈德
mysql/sqlplus 蒙戈

样本文件

以下示例显示了博客网站的文档结构,它只是一个逗号分隔的键值对。

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100, 
   comments: [	
      {
         user:'user1',
         message: 'My first comment',
         dateCreated: new Date(2011,1,20,2,15),
         like: 0 
      },
      {
         user:'user2',
         message: 'My second comments',
         dateCreated: new Date(2011,1,25,7,45),
         like: 5
      }
   ]
}

_id是一个 12 字节的十六进制数,可确保每个文档的唯一性。您可以在插入文档时提供_id。如果您不提供,MongoDB 将为每个文档提供一个唯一的 ID。这 12 个字节中的前 4 个字节表示当前时间戳,接下来的 3 个字节表示机器 ID,接下来的 2 个字节表示 MongoDB 服务器的进程 ID,剩下的 3 个字节是简单的增量 VALUE。

MongoDB - 优点

任何关系数据库都有典型的模式设计,显示表的数量以及这些表之间的关系。而在 MongoDB 中,没有关系的概念。

MongoDB 相对于 RDBMS 的优势

  • Schema less - MongoDB 是一种文档数据库,其中一个集合保存不同的文档。文档的字段数量、内容和大小可能因文档而异。

  • 单个对象的结构清晰。

  • 没有复杂的连接。

  • 深度查询能力。MongoDB 支持使用基于文档的查询语言对文档进行动态查询,该语言几乎与 SQL 一样强大。

  • 调音。

  • 易于扩展- MongoDB 易于扩展。

  • 不需要应用程序对象到数据库对象的转换/映射。

  • 使用内部存储器存储(窗口)工作集,从而可以更快地访问数据。

为什么使用 MongoDB?

  • 面向文档的存储- 数据以 JSON 样式文档的形式存储。

  • 任何属性的索引

  • 复制和高可用性

  • 自动分片

  • 丰富的查询

  • 快速就地更新

  • MongoDB 的专业支持

在哪里使用 MongoDB?

  • 大数据
  • 内容管理和交付
  • 移动和社交基础设施
  • 用户数据管理
  • 数据中心

MongoDB - 环境

现在让我们看看如何在 Windows 上安装 MongoDB。

在 Windows 上安装 MongoDB

要在 Windows 上安装 MongoDB,请首先从https://www.mongodb.org/downloads下载最新版本的 MongoDB 。确保根据您的 Windows 版本获得正确版本的 MongoDB。要获取您的 Windows 版本,请打开命令提示符并执行以下命令。

C:\>wmic os get osarchitecture
OSArchitecture
64-bit
C:\>

32位版本的MongoDB仅支持小于2GB的数据库,仅适用于测试和评估目的。

现在将下载的文件解压到 c:\ 驱动器或任何其他位置。确保解压的文件夹名称为 mongodb-win32-i386-[version] 或 mongodb-win32-x86_64-[version]。这里的[version]是MongoDB下载的版本。

接下来,打开命令提示符并运行以下命令。

C:\>move mongodb-win64-* mongodb
   1 dir(s) moved.
C:\>

如果您在不同位置提取了 MongoDB,则使用命令cd FOLDER/DIR转到该路径,然后运行上面给定的过程。

MongoDB 需要一个数据文件夹来存储其文件。MongoDB 数据目录的默认位置是 c:\data\db。因此,您需要使用命令提示符创建此文件夹。执行以下命令序列。

C:\>md data
C:\md data\db

如果必须将 MongoDB 安装在其他位置,则需要通过在mongod.exe中设置路径dbpath来指定\data\db的备用路径。同样,请发出以下命令。

在命令提示符中,导航到 MongoDB 安装文件夹中的 bin 目录。假设我的安装文件夹是D:\set up\mongodb

C:\Users\XYZ>d:
D:\>cd "set up"
D:\set up>cd mongodb
D:\set up\mongodb>cd bin
D:\set up\mongodb\bin>mongod.exe --dbpath "d:\set up\mongodb\data" 

这将在控制台输出上显示等待连接消息,这表明 mongod.exe 进程正在成功运行。

现在要运行 MongoDB,您需要打开另一个命令提示符并发出以下命令。

D:\set up\mongodb\bin>mongo.exe
MongoDB shell version: 2.4.6
connecting to: test
>db.test.save( { a: 1 } )
>db.test.find()
{ "_id" : ObjectId(5879b0f65a56a454), "a" : 1 }
>

这将表明MongoDB已安装并运行成功。下次运行 MongoDB 时,您只需发出命令。

D:\set up\mongodb\bin>mongod.exe --dbpath "d:\set up\mongodb\data" 
D:\set up\mongodb\bin>mongo.exe

在 Ubuntu 上安装 MongoDB

运行以下命令导入 MongoDB 公共 GPG 密钥 -

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

使用以下命令创建 /etc/apt/sources.list.d/mongodb.list 文件。

echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' 
   | sudo tee /etc/apt/sources.list.d/mongodb.list

现在发出以下命令来更新存储库 -

sudo apt-get update

接下来使用以下命令安装 MongoDB -

apt-get install mongodb-10gen = 2.2.3

在上面的安装中,2.2.3是当前发布的MongoDB版本。确保始终安装最新版本。现在MongoDB已经安装成功了。

启动MongoDB

sudo service mongodb start

停止 MongoDB

sudo service mongodb stop

重启MongoDB

sudo service mongodb restart

要使用 MongoDB,请运行以下命令。

mongo

这会将您连接到正在运行的 MongoDB 实例。

MongoDB 帮助

要获取命令列表,请在 MongoDB 客户端中键入db.help() 。这将为您提供命令列表,如以下屏幕截图所示。

数据库帮助

MongoDB 统计

要获取有关 MongoDB 服务器的统计信息,请在 MongoDB 客户端中键入命令db.stats() 。这将显示数据库名称、数据库中的集合和文档数量。该命令的输出如以下屏幕截图所示。

数据库统计

MongoDB - 数据建模

MongoDB 中的数据具有灵活的 schema.documents 在同一个集合中。它们不需要具有相同的字段集或结构,并且集合文档中的公共字段可以保存不同类型的数据。

MongoDB 设计 Schema 时的一些注意事项

  • 根据用户需求设计您的架构。

  • 如果您要一起使用对象,请将它们合并到一个文档中。否则将它们分开(但确保不需要连接)。

  • 复制数据(但有限),因为与计算时间相比,磁盘空间很便宜。

  • 在写入时进行连接,而不是在读取时进行连接。

  • 针对最常见的用例优化您的架构。

  • 在模式中进行复杂的聚合。

例子

假设客户需要为其博客/网站进行数据库设计,并了解 RDBMS 和 MongoDB 模式设计之间的差异。网站有以下要求。

  • 每个帖子都有唯一的标题、描述和网址。
  • 每篇文章都可以有一个或多个标签。
  • 每个帖子都有其发布者的名称和喜欢的总数。
  • 每个帖子都有用户给出的评论以及他们的姓名、消息、数据时间和喜欢。
  • 每个帖子上可以有零个或多个评论。

在 RDBMS 模式中,针对上述要求的设计将至少具有三个表。

RDBMS 架构设计

在 MongoDB 模式中,设计将有一个集合帖子和以下结构 -

{
   _id: POST_ID
   title: TITLE_OF_POST, 
   description: POST_DESCRIPTION,
   by: POST_BY,
   url: URL_OF_POST,
   tags: [TAG1, TAG2, TAG3],
   likes: TOTAL_LIKES, 
   comments: [	
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES 
      },
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES
      }
   ]
}

因此,在显示数据时,在 RDBMS 中,您需要连接三个表,而在 MongoDB 中,将仅显示一个集合中的数据。

MongoDB - 创建数据库

在本章中,我们将了解如何在 MongoDB 中创建数据库。

使用命令

MongoDB使用 DATABASE_NAME用于创建数据库。如果数据库不存在,该命令将创建一个新数据库,否则将返回现有数据库。

句法

use DATABASE语句的基本语法如下 -

use DATABASE_NAME

例子

如果您想使用名为<mydb>的数据库,则use DATABASE语句如下 -

>use mydb
switched to db mydb

要检查当前选择的数据库,请使用命令db

>db
mydb

如果您想检查数据库列表,请使用命令show dbs

>show dbs
local     0.78125GB
test      0.23012GB

您创建的数据库 (mydb) 未出现在列表中。要显示数据库,您需要在其中插入至少一个文档。

>db.movie.insert({"name":"tutorials point"})
>show dbs
local      0.78125GB
mydb       0.23012GB
test       0.23012GB

在 MongoDB 中,默认数据库是 test。如果您没有创建任何数据库,那么集合将存储在测试数据库中。

MongoDB - 删除数据库

在本章中,我们将了解如何使用 MongoDB 命令删除数据库。

dropDatabase() 方法

MongoDB db.dropDatabase()命令用于删除现有数据库。

句法

dropDatabase()命令的基本语法如下 -

db.dropDatabase()

这将删除选定的数据库。如果您没有选择任何数据库,那么它将删除默认的“test”数据库。

例子

首先,使用命令show dbs检查可用数据库的列表。

>show dbs
local      0.78125GB
mydb       0.23012GB
test       0.23012GB
>

如果您想删除新数据库<mydb>,则dropDatabase()命令如下 -

>use mydb
switched to db mydb
>db.dropDatabase()
>{ "dropped" : "mydb", "ok" : 1 }
>

现在检查数据库列表。

>show dbs
local      0.78125GB
test       0.23012GB
>

MongoDB - 创建集合

在本章中,我们将了解如何使用 MongoDB 创建集合。

createCollection() 方法

MongoDB db.createCollection(name, options)用于创建集合。

句法

createCollection()命令的基本语法如下 -

db.createCollection(name, options)

命令中,name为要创建的集合的名称。options是一个文档,用于指定集合的​​配置。

范围 类型 描述
姓名 细绳 要创建的集合的名称
选项 文档 (可选)指定有关内存大小和索引的选项

Options 参数是可选的,因此您只需指定集合的​​名称。以下是您可以使用的选项列表 -

场地 类型 描述
封顶 布尔值 (可选)如果为 true,则启用上限集合。上限集合是固定大小的集合,当达到其最大大小时,它会自动覆盖其最旧的条目。如果指定 true,则还需要指定 size 参数。
自动索引ID 布尔值 (可选)如果为 true,则自动在 _id 字段上创建索引。默认值为 false。
尺寸 数字 (可选)指定上限集合的最大大小(以字节为单位)。如果 capped 为 true,那么您还需要指定此字段。
最大限度 数字 (可选)指定上限集合中允许的最大文档数。

在插入文档时,MongoDB 首先检查上限集合的 size 字段,然后检查 max 字段。

例子

不带选项的createCollection()方法的基本语法如下 -

>use test
switched to db test
>db.createCollection("mycollection")
{ "ok" : 1 }
>

您可以使用命令show collections检查创建的集合。

>show collections
mycollection
system.indexes

以下示例显示了createCollection()方法的语法,其中包含一些重要选项 -

>db.createCollection("mycol", { capped : true, autoIndexId : true, size : 
   6142800, max : 10000 } )
{ "ok" : 1 }
>

在 MongoDB 中,您不需要创建集合。当您插入某些文档时,MongoDB 会自动创建集合。

>db.tutorialspoint.insert({"name" : "tutorialspoint"})
>show collections
mycol
mycollection
system.indexes
tutorialspoint
>

MongoDB - 删除集合

在本章中,我们将了解如何使用 MongoDB 删除集合。

drop() 方法

MongoDB 的db.collection.drop()用于从数据库中删除集合。

句法

drop()命令的基本语法如下 -

db.COLLECTION_NAME.drop()

例子

首先,将可用集合检查到数据库mydb中。

>use mydb
switched to db mydb
>show collections
mycol
mycollection
system.indexes
tutorialspoint
>

现在删除名为mycollection的集合。

>db.mycollection.drop()
true
>

再次将集合列表检查到数据库中。

>show collections
mycol
system.indexes
tutorialspoint
>

如果所选集合被成功删除,drop() 方法将返回 true,否则将返回 false。

MongoDB - 数据类型

MongoDB 支持多种数据类型。其中一些是 -

  • 字符串- 这是存储数据最常用的数据类型。MongoDB 中的字符串必须是 UTF-8 有效的。

  • 整数- 此类型用于存储数值。整数可以是 32 位或 64 位,具体取决于您的服务器。

  • Boolean - 此类型用于存储布尔(真/假)值。

  • Double - 此类型用于存储浮点值。

  • 最小/最大键- 此类型用于将值与最低和最高 BSON 元素进行比较。

  • 数组- 这种类型用于将数组或列表或多个值存储到一个键中。

  • 时间戳- ctimestamp。当文档被修改或添加时,这可以方便地进行记录。

  • 对象- 此数据类型用于嵌入文档。

  • Null - 此类型用于存储 Null 值。

  • 符号- 此数据类型与字符串的使用方式相同;但是,它通常保留用于使用特定符号类型的语言。

  • 日期- 此数据类型用于以 UNIX 时间格式存储当前日期或时间。您可以通过创建 Date 对象并向其中传递日、月、年来指定自己的日期时间。

  • 对象 ID - 此数据类型用于存储文档的 ID。

  • 二进制数据- 此数据类型用于存储二进制数据。

  • 代码- 此数据类型用于将 JavaScript 代码存储到文档中。

  • 正则表达式- 此数据类型用于存储正则表达式。

MongoDB - 插入文档

在本章中,我们将学习如何在 MongoDB 集合中插入文档。

insert() 方法

要将数据插入到 MongoDB 集合中,需要使用 MongoDB 的insert()save()方法。

句法

insert()命令的基本语法如下 -

>db.COLLECTION_NAME.insert(document)

例子

>db.mycol.insert({
   _id: ObjectId(7df78ad8902c),
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
})

这里mycol是我们在上一章中创建的集合名称。如果数据库中不存在该集合,则 MongoDB 将创建该集合,然后将文档插入其中。

在插入的文档中,如果我们不指定_id参数,那么MongoDB会为此文档分配一个唯一的ObjectId。

_id 是 12 字节的十六进制数字,对于集合中的每个文档都是唯一的。12 个字节划分如下 -

_id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 
   3 bytes incrementer)

要在单个查询中插入多个文档,您可以在 insert() 命令中传递文档数组。

例子

>db.post.insert([
   {
      title: 'MongoDB Overview', 
      description: 'MongoDB is no sql database',
      by: 'tutorials point',
      url: 'http://www.tutorialspoint.com',
      tags: ['mongodb', 'database', 'NoSQL'],
      likes: 100
   },
	
   {
      title: 'NoSQL Database', 
      description: "NoSQL database doesn't have tables",
      by: 'tutorials point',
      url: 'http://www.tutorialspoint.com',
      tags: ['mongodb', 'database', 'NoSQL'],
      likes: 20, 
      comments: [	
         {
            user:'user1',
            message: 'My first comment',
            dateCreated: new Date(2013,11,10,2,35),
            like: 0 
         }
      ]
   }
])

要插入文档,您也可以使用db.post.save(document)。如果您未在文档中指定_id ,则save()方法将与insert()方法相同。如果您指定 _id 那么它将替换包含 _id 的文档的整个数据,如 save() 方法中指定的那样。

MongoDB - 查询文档

在本章中,我们将学习如何从 MongoDB 集合中查询文档。

find() 方法

要从 MongoDB 集合中查询数据,需要使用 MongoDB 的find()方法。

句法

find()方法的基本语法如下 -

>db.COLLECTION_NAME.find()

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

Pretty() 方法

要以格式化的方式显示结果,可以使用Pretty()方法。

句法

>db.mycol.find().pretty()

例子

>db.mycol.find().pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

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

MongoDB 中的 RDBMSWhere 子句等效项

要根据某些条件查询文档,可以使用以下操作。

手术 句法 例子 关系型数据库管理系统等效项
平等 {<键>:<值>} db.mycol.find({"by":"教程点"}).pretty() 其中 by = '教程点'
少于 {<键>:{$lt:<值>}} db.mycol.find({"likes":{$lt:50}}).pretty() 其中喜欢 < 50
小于等于 {<键>:{$lte:<值>}} db.mycol.find({"likes":{$lte:50}}).pretty() 其中喜欢 <= 50
比...更棒 {<键>:{$gt:<值>}} db.mycol.find({"likes":{$gt:50}}).pretty() 哪里喜欢> 50
大于等于 {<键>:{$gte:<值>}} db.mycol.find({"likes":{$gte:50}}).pretty() 其中喜欢 >= 50
不等于 {<键>:{$ne:<值>}} db.mycol.find({"likes":{$ne:50}}).pretty() 哪里喜欢!= 50

MongoDB 中的 AND

句法

find()方法中,如果您通过“,”分隔来传递多个键,那么 MongoDB 会将其视为AND条件。以下是AND的基本语法-

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

例子

以下示例将显示“tutorials point”编写的标题为“MongoDB Overview”的所有教程。

>db.mycol.find({$and:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty() {
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}

对于上面给出的示例,等效的 where 子句将是' where by = 'tutorials point' AND title = 'MongoDB Overview' '。您可以在 find 子句中传递任意数量的键、值对。

或在 MongoDB 中

句法

如果要根据OR条件查询文档,需要使用$or关键字。以下是OR的基本语法-

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

例子

以下示例将显示“tutorials point”编写的或标题为“MongoDB Overview”的所有教程。

>db.mycol.find({$or:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

一起使用 AND 和 OR

例子

以下示例将显示点赞数超过 10 且标题为“MongoDB Overview”或“tutorials point”的文档。等效的 SQL where 子句为'where likes>10 AND (by = '教程点' OR title = 'MongoDB 概述')'

>db.mycol.find({"likes": {$gt:10}, $or: [{"by": "tutorials point"},
   {"title": "MongoDB Overview"}]}).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

MongoDB - 更新文档

MongoDB 的update()save()方法用于将文档更新到集合中。update() 方法更新现有文档中的值,而 save() 方法用 save() 方法中传递的文档替换现有文档。

MongoDB Update() 方法

update() 方法更新现有文档中的值。

句法

update()方法的基本语法如下 -

>db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)

例子

考虑 mycol 集合具有以下数据。

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

以下示例将为标题为“MongoDB 概述”的文档设置新标题“新 MongoDB 教程”。

>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"New MongoDB Tutorial"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

默认情况下,MongoDB 将仅更新单个文档。要更新多个文档,您需要将参数“multi”设置为 true。

>db.mycol.update({'title':'MongoDB Overview'},
   {$set:{'title':'New MongoDB Tutorial'}},{multi:true})

MongoDB Save() 方法

save ()方法用 save() 方法中传递的新文档替换现有文档。

句法

MongoDB save()方法的基本语法如下所示 -

>db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})

例子

以下示例将用 _id '5983548781331adf45ec5' 替换文档。

>db.mycol.save(
   {
      "_id" : ObjectId(5983548781331adf45ec5), "title":"Tutorials Point New Topic",
      "by":"Tutorials Point"
   }
)
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"Tutorials Point New Topic",
   "by":"Tutorials Point"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

MongoDB - 删除文档

在本章中,我们将学习如何使用 MongoDB 删除文档。

移除()方法

MongoDB 的remove()方法用于从集合中删除文档。remove() 方法接受两个参数。一是删除标准,二是 justOne 标志。

  • 删除标准- (可选)根据文档的删除标准将被删除。

  • justOne - (可选)如果设置为 true 或 1,则仅删除一个文档。

句法

remove()方法的基本语法如下 -

>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

例子

考虑 mycol 集合具有以下数据。

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

以下示例将删除标题为“MongoDB Overview”的所有文档。

>db.mycol.remove({'title':'MongoDB Overview'})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

仅删除一个

如果有多条记录,并且只想删除第一条记录,则在remove()方法中设置justOne参数。

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

删除所有文档

如果您不指定删除条件,那么 MongoDB 将从集合中删除整个文档。这相当于 SQL 的 truncate 命令。

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

MongoDB - 投影

在 MongoDB 中,投影意味着仅选择必要的数据,而不是选择文档的全部数据。如果文档有 5 个字段,而您只需要显示 3 个字段,则仅从中选择 3 个字段。

find() 方法

MongoDB 的find()方法(在MongoDB 查询文档中进行了解释)接受第二个可选参数,即要检索的字段列表。在 MongoDB 中,当您执行find()方法时,它会显示文档的所有字段。为了限制这种情况,您需要设置一个值为 1 或 0 的字段列表。1 用于显示字段,而 0 用于隐藏字段。

句法

带投影的find()方法的基本语法如下 -

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

例子

考虑 mycol 集合具有以下数据 -

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

以下示例将在查询文档时显示文档的标题。

>db.mycol.find({},{"title":1,_id:0})
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
{"title":"Tutorials Point Overview"}
>

请注意,执行find()方法时始终显示_id字段,如果您不需要该字段,则需要将其设置为 0。

MongoDB - 限制记录

在本章中,我们将学习如何使用 MongoDB 限制记录。

Limit() 方法

要限制MongoDB中的记录,需要使用limit()方法。该方法接受一个数字类型参数,即要显示的文档数。

句法

limit()方法的基本语法如下 -

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

例子

考虑集合 myycol 具有以下数据。

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

以下示例在查询文档时仅显示两个文档。

>db.mycol.find({},{"title":1,_id:0}).limit(2)
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
>

如果您没有在limit()方法中指定 number 参数,那么它将显示集合中的所有文档。

MongoDB Skip() 方法

除了limit()方法之外,还有一种方法skip()也接受数字类型参数,用于跳过文档的数量。

句法

Skip()方法的基本语法如下 -

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

例子

以下示例将仅显示第二个文档。

>db.mycol.find({},{"title":1,_id:0}).limit(1).skip(1)
{"title":"NoSQL Overview"}
>

请注意, skip()方法的默认值为0。

MongoDB - 对记录进行排序

在本章中,我们将学习如何在 MongoDB 中对记录进行排序。

sort() 方法

要对 MongoDB 中的文档进行排序,需要使用sort()方法。该方法接受包含字段列表及其排序顺序的文档。使用 1 和 -1 指定排序顺序。1 用于升序,-1 用于降序。

句法

sort()方法的基本语法如下 -

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

例子

考虑集合 myycol 具有以下数据。

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

以下示例将显示按标题降序排列的文档。

>db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})
{"title":"Tutorials Point Overview"}
{"title":"NoSQL Overview"}
{"title":"MongoDB Overview"}
>

请注意,如果您不指定排序首选项,则sort()方法将以升序显示文档。

MongoDB - 索引

索引支持查询的有效解决。如果没有索引,MongoDB 必须扫描集合中的每个文档以选择与查询语句匹配的文档。这种扫描效率极低,并且需要 MongoDB 处理大量数据。

索引是特殊的数据结构,它以易于遍历的形式存储一小部分数据集。索引存储特定字段或字段集的值,按索引中指定的字段值排序。

createIndex() 方法

要创建索引,需要使用MongoDB的createIndex()方法。

句法

createIndex()方法的基本语法如下()。

>db.COLLECTION_NAME.createIndex({KEY:1})

这里的 key 是要创建索引的字段名称,1 表示升序。要按降序创建索引,您需要使用-1。

例子

>db.mycol.createIndex({"title":1})
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}
>

createIndex()方法中,您可以传递多个字段,以在多个字段上创建索引。

>db.mycol.createIndex({"title":1,"description":-1})
>

此方法还接受选项列表(可选)。以下是列表 -

范围 类型 描述
背景 布尔值 在后台构建索引,以便构建索引不会阻塞其他数据库活动。指定 true 以在后台构建。默认值为false
独特的 布尔值 创建唯一索引,以便集合不会接受索引键与索引中现有值匹配的文档插入。指定 true 以创建唯一索引。默认值为false
姓名 细绳 索引的名称。如果未指定,MongoDB 将通过连接索引字段的名称和排序顺序来生成索引名称。
布尔值 如果为 true,则索引仅引用具有指定字段的文档。这些索引使用较少的空间,但在某些情况下(特别是排序)表现不同。默认值为false
秒后过期 整数 指定一个值(以秒为单位)作为 TTL,以控制 MongoDB 在此集合中保留文档的时间。
重量 文档 权重是一个范围从 1 到 99,999 的数字,表示该字段相对于其他索引字段的得分重要性。
默认语言 细绳 对于文本索引,确定停用词列表以及词干分析器和分词器规则的语言。默认值为英语
语言覆盖 细绳 对于文本索引,指定文档中包含的字段名称,以覆盖默认语言。默认值是语言。

dropIndex() 方法

您可以使用 MongoDB 的 dropIndex() 方法删除特定索引。

句法

DropIndex()方法的基本语法如下()。

>db.COLLECTION_NAME.dropIndex({KEY:1})

此处,“key”是要删除其现有索引的文件的名称。您还可以直接指定索引名称,而不是索引规范文档(上述语法):

dropIndex("name_of_the_index")

例子

> db.mycol.dropIndex({"title":1})
{
	"ok" : 0,
	"errmsg" : "can't find index with key: { title: 1.0 }",
	"code" : 27,
	"codeName" : "IndexNotFound"
}

dropIndexes() 方法

此方法删除集合上的多个(指定)索引。

句法

DropIndexes() 方法的基本语法如下() -

>db.COLLECTION_NAME.dropIndexes()

例子

假设我们在名为 mycol 的集合中创建了 2 个索引,如下所示 -

> db.mycol.createIndex({"title":1,"description":-1})

以下示例删除上面创建的 mycol 索引 -

>db.mycol.dropIndexes({"title":1,"description":-1})
{ "nIndexesWas" : 2, "ok" : 1 }
>

getIndexes() 方法

此方法返回集合中所有索引的描述。

句法

以下是 getIndexes() 方法的基本语法 -

db.COLLECTION_NAME.getIndexes()

例子

假设我们在名为 mycol 的集合中创建了 2 个索引,如下所示 -

> db.mycol.createIndex({"title":1,"description":-1})

以下示例检索集合 mycol 中的所有索引 -

> db.mycol.getIndexes()
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "test.mycol"
	},
	{
		"v" : 2,
		"key" : {
			"title" : 1,
			"description" : -1
		},
		"name" : "title_1_description_-1",
		"ns" : "test.mycol"
	}
]
>

MongoDB - 聚合

聚合操作处理数据记录并返回计算结果。聚合操作将多个文档中的值分组在一起,并且可以对分组的数据执行各种操作以返回单个结果。在 SQL 中 count(*) 和 group by 相当于 mongodb 聚合。

aggregate() 方法

对于MongoDB中的聚合,您应该使用aggregate()方法。

句法

aggregate()方法的基本语法如下 -

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

例子

在集合中,您有以下数据 -

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

现在,从上面的集合中,如果您想显示一个列表,说明每个用户编写了多少教程,那么您将使用以下aggregate()方法 -

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "tutorials point",
         "num_tutorial" : 2
      },
      {
         "_id" : "Neo4j",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}
>

上述用例的 Sql 等效查询将是select by_user, count(*) from mycol group by by_user

在上面的示例中,我们按字段by_user对文档进行分组,并且在每次出现 by_user 时,之前的 sum 值都会递增。以下是可用聚合表达式的列表。

表达 描述 例子
$总和 汇总集合中所有文档的定义值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
平均$ 计算集合中所有文档的所有给定值的平均值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
分钟$ 获取集合中所有文档中对应值的最小值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
最高$ 获取集合中所有文档中对应值的最大值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$推 将值插入到结果文档中的数组中。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet 将值插入到结果文档中的数组中,但不创建重复项。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$第一 根据分组从源文档中获取第一个文档。通常,这只有与之前应用的一些“$sort”阶段一起才有意义。 db.mycol.aggregate([{$group:{_id:“$by_user”,first_url:{$first:“$url”}}}])
$最后 根据分组从源文档中获取最后一个文档。通常,这只有与之前应用的一些“$sort”阶段一起才有意义。 db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

管道概念

在 UNIX 命令中,shell 管道意味着可以对某些输入执行操作并将输出用作下一个命令的输入,依此类推。MongoDB 在聚合框架中也支持相同的概念。有一组可能的阶段,每个阶段都被视为一组文档作为输入,并生成一组结果文档(或管道末尾的最终结果 JSON 文档)。然后,这又可以用于下一阶段,依此类推。

以下是聚合框架中可能的阶段 -

  • $project - 用于从集合中选择一些特定字段。

  • $match - 这是一个过滤操作,因此可以减少作为下一阶段输入的文档数量。

  • $group - 这会执行上面讨论的实际聚合。

  • $sort - 对文档进行排序。

  • $skip - 有了这个,可以在文档列表中向前跳过给定数量的文档。

  • $limit - 这通过从当前位置开始的给定数量来限制要查看的文档数量。

  • $unwind - 用于展开使用数组的文档。使用数组时,数据是预先连接的,并且此操作将被撤消以再次拥有单独的文档。所以这个阶段我们会增加下一阶段的文件量。

MongoDB - 复制

复制是跨多个服务器同步数据的过程。复制通过不同数据库服务器上的多个数据副本提供冗余并提高数据可用性。复制可以保护数据库免受单个服务器丢失的影响。复制还允许您从硬件故障和服务中断中恢复。通过额外的数据副本,您可以将一份专用于灾难恢复、报告或备份。

为什么要复制?

  • 确保您的数据安全
  • 数据高(24*7)可用性
  • 灾难恢复
  • 无需停机维护(如备份、索引重建、压缩)
  • 读取缩放(要读取的额外副本)
  • 副本集对应用程序是透明的

复制在 MongoDB 中的工作原理

MongoDB 通过使用副本集来实现复制。副本集是一组托管相同数据集的mongod实例。在副本中,一个节点是接收所有写入操作的主节点。所有其他实例(例如辅助实例)都会应用主实例的操作,以便它们具有相同的数据集。副本集只能有一个主节点。

  • 副本集是一组两个或多个节点(通常至少需要 3 个节点)。

  • 在副本集中,一个节点是主节点,其余节点是辅助节点。

  • 所有数据从主节点复制到辅助节点。

  • 在自动故障转移或维护时,会建立主节点选举并选举出新的主节点。

  • 故障节点恢复后,再次加入副本集,作为Secondary节点。

MongoDB 复制的典型图如下所示,其中客户端应用程序始终与主节点交互,然后主节点将数据复制到辅助节点。

MongoDB 复制

副本集特性

  • N 个节点的集群
  • 任何一个节点都可以是主节点
  • 所有写操作都转到主节点
  • 自动故障转移
  • 自动恢复
  • 共识选举初选

设置副本集

在本教程中,我们将把独立的 MongoDB 实例转换为副本集。要转换为副本集,请执行以下步骤 -

  • 关闭已经运行的 MongoDB 服务器。

  • 通过指定 --replSet 选项启动 MongoDB 服务器。以下是 --replSet 的基本语法 -

mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

例子

mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
  • 它将在端口 27017 上启动一个名为 rs0 的 mongod 实例。

  • 现在启动命令提示符并连接到此 mongod 实例。

  • 在 Mongo 客户端中,发出命令rs.initiate()来启动新的副本集。

  • 要检查副本集配置,请发出命令rs.conf()。要检查副本集的状态,请发出命令rs.status()

将成员添加到副本集

要将成员添加到副本集,请在多台计算机上启动 mongod 实例。现在启动 mongo 客户端并发出命令rs.add()

句法

rs.add()命令的基本语法如下 -

>rs.add(HOST_NAME:PORT)

例子

假设您的 mongod 实例名称是mongod1.net并且它在端口27017上运行。要将此实例添加到副本集,请在 Mongo 客户端中发出命令rs.add() 。

>rs.add("mongod1.net:27017")
>

仅当连接到主​​节点时,才能将 mongod 实例添加到副本集。要检查您是否连接到主数据库,请在 mongo 客户端中发出命令db.isMaster() 。

MongoDB - 分片

分片是跨多台机器存储数据记录的过程,是 MongoDB 满足数据增长需求的方法。随着数据大小的增加,单台机器可能不足以存储数据,也无法提供可接受的读写吞吐量。分片解决了水平扩展的问题。通过分片,您可以添加更多机器来支持数据增长以及读写操作的需求。

为什么要分片?

  • 在复制中,所有写入都转到主节点
  • 延迟敏感查询仍由 master 处理
  • 单个副本集限制为 12 个节点
  • 当活动数据集很大时,内存不能足够大
  • 本地磁盘不够大
  • 垂直缩放成本太高

MongoDB 中的分片

下图显示了 MongoDB 中使用分片集群的分片。

MongoDB 分片

在下图中,有三个主要组成部分 -

  • 分片- 分片用于存储数据。它们提供高可用性和数据一致性。在生产环境中,每个分片都是一个单独的副本集。

  • 配置服务器- 配置服务器存储集群的元数据。该数据包含集群数据集到分片的映射。查询路由器使用此元数据将操作定位到特定分片。在生产环境中,分片集群正好有 3 个配置服务器。

  • 查询路由器- 查询路由器基本上是 mongo 实例,与客户端应用程序交互并直接操作适当的分片。查询路由器处理并将操作定位到分片,然后将结果返回给客户端。分片集群可以包含多个查询路由器来划分客户端请求负载。客户端向一个查询路由器发送请求。通常,分片集群有许多查询路由器。

MongoDB - 创建备份

在本章中,我们将了解如何在 MongoDB 中创建备份。

转储 MongoDB 数据

要在 MongoDB 中创建数据库备份,您应该使用mongodump命令。此命令会将服务器的全部数据转储到转储目录中。您可以使用许多选项来限制数据量或创建远程服务器的备份。

句法

mongodump命令的基本语法如下 -

>mongodump

例子

启动你的 mongod 服务器。假设您的 mongod 服务器在 localhost 和端口 27017 上运行,打开命令提示符并转到 mongodb 实例的 bin 目录并键入命令mongodump

考虑 mycol 集合具有以下数据。

>mongodump

该命令将连接到运行在127.0.0.1和端口27017 的服务器,并将服务器的所有数据返回到目录/bin/dump/。以下是命令的输出 -

数据库统计

以下是可与mongodump命令一起使用的可用选项列表。

句法 描述 例子
mongodump --主机 HOST_NAME --端口 PORT_NUMBER 该命令将备份指定 mongod 实例的所有数据库。 mongodump --主机tutorialspoint.com --端口 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY 该命令将仅备份指定路径下的指定数据库。 mongodump --dbpath /数据/db/ --out /数据/备份/
mongodump --collection 集合 --db DB_NAME 此命令将仅备份指定数据库的指定集合。 mongodump --collection mycol --db 测试

恢复数据

要恢复备份数据,使用MongoDB 的mongorestore命令。此命令将从备份目录恢复所有数据。

句法

mongorestore命令的基本语法是 -

>mongorestore

以下是命令的输出 -

数据库统计

MongoDB - 部署

当您准备 MongoDB 部署时,您应该尝试了解您的应用程序将如何在生产中保持稳定。开发一种一致、可重复的方法来管理部署环境是一个好主意,这样您就可以在投入生产后最大程度地减少意外情况。

最好的方法包括对您的设置进行原型设计、进行负载测试、监控关键指标以及使用该信息来扩展您的设置。该方法的关键部分是主动监控整个系统 - 这将帮助您了解生产系统在部署之前的运行情况,并确定需要在何处增加容量。例如,深入了解内存使用量的潜在峰值可以帮助在写锁火灾发生之前将其扑灭。

为了监控您的部署,MongoDB 提供了以下一些命令 -

蒙哥斯塔

此命令检查所有正在运行的 mongod 实例的状态并返回数据库操作的计数器。这些计数器包括插入、查询、更新、删除和游标。命令还会显示您何时遇到页面错误,并显示您的锁定百分比。这意味着您的内存不足、达到写入容量或存在一些性能问题。

要运行该命令,请启动您的 mongod 实例。在另一个命令提示符中,转到mongodb 安装的bin目录并输入mongostat

D:\set up\mongodb\bin>mongostat

以下是命令的输出 -

蒙哥斯塔

蒙戈托普

该命令以集合为基础跟踪并报告 MongoDB 实例的读写活动。默认情况下,mongotop每秒返回一次信息,您可以相应地更改它。您应该检查此读取和写入活动是否符合您的应用程序意图,并且您没有一次向数据库发出太多写入、从磁盘读取过于频繁或超出您的工作集大小。

要运行该命令,请启动您的 mongod 实例。在另一个命令提示符中,转到mongodb 安装的bin目录并输入mongotop

D:\set up\mongodb\bin>mongotop

以下是命令的输出 -

蒙戈托普

要更改mongotop命令以降低返回信息的频率,请在 mongotop 命令后指定特定数字。

D:\set up\mongodb\bin>mongotop 30

上面的示例将每 30 秒返回一次值。

除了 MongoDB 工具之外,10gen 还提供免费的托管监控服务 MongoDB 管理服务 (MMS),它提供仪表板并让您查看整个集群的指标。

MongoDB-Java

在本章中,我们将学习如何设置 MongoDB JDBC 驱动程序。

安装

在开始在 Java 程序中使用 MongoDB 之前,您需要确保计算机上已设置 MongoDB JDBC 驱动程序和 Java。您可以查看 Java 教程以了解您计算机上的 Java 安装。现在,让我们看看如何设置 MongoDB JDBC 驱动程序。

  • 您需要从下载 mongo.jar路径下载 jar 。请务必下载它的最新版本。

  • 您需要将 mongo.jar 包含到您的类路径中。

连接到数据库

连接数据库时,需要指定数据库名称,如果数据库不存在,MongoDB会自动创建。

以下是连接到数据库的代码片段 -

import com.mongodb.client.MongoDatabase; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class ConnectToDB { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 
   
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to