第3章〓MongoDB数据库操作学习目标
 掌握MongoDB的部署
 熟悉数据库和集合操作
 掌握文档的插入、更新、删除以及查询操作
 掌握使用Java操作MongoDB
 掌握使用Python操作MongoDB
 掌握使用Robo 3T操作MongoDB如果说理论知识是宝库,那么开启这个宝库的钥匙是实践操作。如果想要深入学习和掌握MongoDB数据库,除了学习MongoDB数据库的理论知识之外,还应掌握MongoDB数据库的实践操作。本章将针对MongoDB数据库操作的相关知识进行详细讲解。
3.1MongoDB部署
MongoDB是一个开源、跨平台的数据库,它可以运行在Windows和Linux等多个平台上,为我们提供数据库服务。在不同的操作系统平台上,部署MongoDB也会有所不同。本节,我们将详细讲解MongoDB数据库基于Windows平台和Linux平台的部署。
3.1.1基于Windows平台
MongoDB提供了可用于32位系统和64位系统的预编译二进制安装包,其中,32位的安装包不允许数据库文件(累积总和)超过2GB,一般用于在32位的系统/平台上部署测试和开发,不可用于实际生产环境;而64位的安装包对数据库文件没有限制,因此受到了开发人员的青睐,因此,本书选择使用64位的MongoDB安装包(注意: 选择MongoDB安装包之前,需要确认操作系统的位数,即32位或64位,其中在32位的系统上只能安装32位的MongoDB,在64位系统上既可以安装32位,也可以安装64位的MongoDB)。基于Windows平台的MongoDB部署的具体步骤如下。
1. 下载MongoDB安装包
通过访问MongoDB官网https://www.mongodb.com/downloadcenter/community进入MongoDB下载页面,如图31所示。
图31MongoDB官网下载页面
在图31中,单击Version处的下拉框,选择需要安装的版本;单击OS处的下拉框选择要适配的系统或平台;单击Package处的下拉框,选择安装包的打包方式。关于MongoDB安装包版本、适配系统/平台以及打包方式的选择,具体介绍如下: 
 Version选择: MongoDB的版本分为稳定版和开发版,其中,稳定版是经过充分测试的版本,具有稳定性和可靠性;而开发版是未得到充分测试的版本,不适合初学者使用。本书选择编写教材时的稳定版本4.2.2。这里需要注意,稳定版和开发版的区别在于版本号(类似于x.y.z),版本号中的第一位数字是主版本号;第二位数字是用于区分是稳定版还是开发版,若该数字为偶数,则说明该版本为稳定版,反之则为开发版;第三位数字为修订号。
 OS选择: 由于我们是基于Windows平台,所以选择“Windows x64 x64”选项。
 Package选择: 基于Windows平台的安装包打包方式有两种,分别是MSI和ZIP,其中MSI安装包需要进行安装,而ZIP安装包只需要解压安装包,即可使用,因此这里选择ZIP安装包。
第3章MongoDB数据库操作NoSQL数据库技术与应用单击图31中的Download按钮,下载选择的MongoDB安装包。下载好MongoDB安装包,如图32所示。
图32下载好的MongoDB安装包2. 解压MongoDB安装包
解压图32中的MongoDB安装包,解压完即可使用MongoDB,读者也可以自行将文件夹重命名为mongodb,然后再使用。解压后的MongoDB,具体如图33所示。
图33解压后的MongoDB
从图33中可以看出,解压后的MongoDB包含一个bin文件夹,该文件夹中存放了很多MongoDB程序。下面,我们通过表31来介绍一下MongoDB程序。表31MongoDB程序程序相 关 说 明mongo.exe用于启动MongoDB Shell客户端(Mongo Shell命令行交互界面),在客户端里可执行相关命令对数据库进行增删改查等操作mongod.exe用于启动MongoDB服务mongos.exe用于启动MongoDB分片路由服务,可以处理来自应用层的查询操作并且识别所请求的数据位于分片群集的位置bsondump.exe用于将bson格式的文件转储为json格式的数据mongodump.exe用于备份MongoDB数据库中的数据mongoexport.exe用于导出MongoDB数据库中的数据mongofiles.exe用于管理GridFSmongoimport.exe用于将数据导入MongoDB数据库中mongorestore.exe用于MongoDB的数据恢复mongostat.exe用于检测MongoDB数据库的状态mongotop.exe用于监控MongoDB数据库中数据的读写情况3. 启动MongoDB服务
启动MongoDB服务共有两种不同的方式,即使用命令行参数的方式和使用配置文件的方式,这两种启动方式的介绍如下。
(1) 使用命令行参数的方式启动MongoDB服务。
在使用命令行参数的方式启动MongoDB服务之前,需要在MongoDB的解压文件夹下创建一个文件夹,用于存放数据库文件和日志文件,因此本书创建了data文件夹,如图34所示。并在data文件夹下创建db和log子文件夹,其中db文件夹用于存储数据库文件,log文件夹用于存储日志文件(便于在日志文件中查看MongoDB相关使用信息,不然关闭命令行窗口后,将无法再次查看MongoDB的日志),如图35所示。
图34父文件夹data
图35子文件夹db和log
在MongoDB的bin文件夹下打开命令行窗口。进入bin文件夹,在目录栏中输入cmd提示符,如图36所示。
图36输入cmd提示符
在图36中的目录栏处,按Enter键,在当前路径下打开命令行窗口,如图37所示。
图37命令行窗口
在图37中,执行mongod dbpath D:\\MongoDB\\mongodbwin32x86_642012plus4.2.2\\data\\db logpath D:\\MongoDB\\mongodbwin32x86_642012plus4.2.2\\data\\logs\\mongodb.log logappend命令,启动MongoDB服务,命令行窗口的光标会一直闪动,效果如图38所示。然后查看日志文件mongodb.log,若是日志文件中出现MongoDB starting,则说明MongoDB服务启动成功,反之失败。日志文件mongodb.log的内容,如图39所示。图38命令行窗口
图39日志文件mongodb.log中的内容从图39中可以看出,日志文件mongodb.log中出现了MongoDB starting,因此说明我们成功启动了MongoDB服务。若是想要关闭MongoDB服务,只需要关闭命令行窗口即可。
(2) 使用配置文件的方式启动MongoDB服务。
在使用配置文件的方式启动MongoDB服务之前,需要在MongoDB的解压文件夹下创建一个文件夹conf,用于存放MongoDB数据库的配置文件,并在该文件夹下创建一个文件mongod.conf,用于指定数据库文件的存储路径及MongoDB的相关配置信息,文件mongod.conf的内容如下所示: storage:
dbPath: D:\\MongoDB\\mongodb-win32-x86_64-2012plus-4.2.2\\data\\db
systemLog:
destination: file
path: D:\\MongoDB\\mongodb-win32-x86_64-2012plus-4.2.2\\logs\\mongodb.log
logAppend: true

在图37所示的命令行窗口中,执行相关命令,启动MongoDB服务,具体命令如下: mongod -f ..\\conf\\mongod.conf

或mongod --config ..\\conf\\mongod.conf

执行上述两条命令中的任意一条均可以启动MongoDB服务,这里以执行第一条命令进行演示,启动MongoDB服务,命令行窗口的光标会一直闪动,效果如图310所示。然后查看日志文件mongodb.log,若是日志文件中出现MongoDB starting,则说明MongoDB服务启动成功,反之失败,日志文件mongodb.log中的内容,如图311所示。
图310命令行窗口
图311日志文件mongodb.log中的内容
从图311中可以看出,日志文件mongodb.log中出现了MongoDB starting,因此说明我们成功启动了MongoDB服务。若想关闭MongoDB服务,只需要关闭命令行窗口即可。
3.1.2基于Linux平台
基于Linux平台部署MongoDB之前,我们需要搭建Linux平台,关于Linux平台的搭建步骤,请参考本书提供的环境配置文档(注意: 为了便于后续章节的操作使用,读者需要根据环境配置文档完成虚拟机NoSQL_1、NoSQL_2、NoSQL_3的创建和配置以及系统目录结构的创建操作)。本章,我们将在虚拟机NoSQL_1(即IP地址为192.168.121.134的主机)中完成MongoDB数据库的部署和相关操作。
由于root用户拥有的权限很大,出于系统安全的考虑,需要新建一个普通用户操作MongoDB数据库,因此我们需要新建一个用户user_mongo。下面,我们详细介绍如何新建用户user_mongo。
1. 新建用户
打开Linux虚拟机并通过远程工具Secure CRT连接Linux平台,执行useradd user_mongo命令,新建用户user_mongo;再执行passwd user_mongo命令,初始化新用户user_mongo的密码,具体如下: \[root@nosql01~\]# useradd user_mongo
\[root@nosql01~\]# passwd user_mongo
Changing password for user user_mongo.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

从上述返回结果successfully可以看出,所有的身份验证令牌已经成功更新,即用户user_mongo的密码初始化成功,这里设置的密码为123456(New password和Retype new password处均填密码123456)。
2. 用户授权
首先执行ls l /etc/sudoers命令,查看文件sudoers的操作权限,具体如下: \[root@nosql01 ~\]# ls -l /etc/sudoers 
-r--r-----. 1 root root 4188 Jul72015 /etc/sudoers

从上述返回结果可以看出,文件sudoers的操作权限为只读,不可进行编辑操作。因此需要执行chmod v u+w /etc/sudoers命令,将文件sudoers的权限修改为可编辑,然后执行查看ls l /etc/sudoers命令,查看文件sudoers的权限是否变为可编辑,具体如下: \[root@nosql01 ~\]# chmod -v u+w /etc/sudoers
mode of '/etc/sudoers' changed from 0440 (r--r-----) to 0640 (rw-r-----)
\[root@nosql01 ~\]# ls -l /etc/sudoers 
-rw-r-----. 1 root root 4188 Jul72015 /etc/sudoers

从上述返回结果可以看出,文件sudoers的操作权限为读写权限,说明我们已经成功将文件sudoers的操作权限修改为可编辑。需要注意,为了系统安全编辑完文件sudoers后,必须执行chmod v uw /etc/sudoers命令,将该文件的权限改为默认的只读权限。
执行vi /etc/sudoers命令,进入sudoers文件中,添加user_mongo ALL=(ALL) ALL内容,按ESC键,再执行:wq!命令,保存并退出sudoers文件。sudoers文件添加的内容,具体如图312所示。
图312将user_mongo用户添加到sudoers文件中
执行su user_mongo命令,从root用户切换到user_mongo用户,效果如图313所示。
图313切换到用户user_mongo
从图313中可以看出,我们成功切换到user_mongo用户。至此,我们完成了用户user_mongo的创建以及使用管理员命令的授权。
接下来,我们将详细讲解如何基于Linux平台部署MongoDB,具体部署步骤如下。
1. 下载MongoDB安装包
通过访问MongoDB官网https://www.mongodb.com/downloadcenter/community进入MongoDB下载页面,如图314所示。
图314MongoDB官网下载页面
在图314中,单击Version处的下拉框,选择需要安装的版本4.2.2;单击OS处的下拉框选择要适配的系统或平台,由于本书的Linux系统是CentOS 7 64位,因此选择“RHEL 7.0 Linux 64bit x64”选项;单击Package处的下拉框,选择安装包的打包方式,这里选择TGZ方式。单击Download按钮,下载所选择的MongoDB安装包。下载的MongoDB安装包如图315所示。
图315下载好的MongoDB安装包
2. 解压MongoDB安装包
下载MongoDB安装包后,使用SecureCRT工具将MongoDB安装包上传至Linux平台的/opt/software目录下(需提前进入/opt/software目录下)。首先执行sudo rz上传文件命令(可以通过sudo yum install lrzsz y指令安装lrzsz工具,实现rz上传和sz下载命令),弹出Select Files to Send using Zmodem对话框,然后选择要上传的MongoDB安装包,单击Add按钮,将其添加至Files to send文件框中,最后单击OK按钮,将MongoDB安装包上传至/opt/software目录下,如图316所示。
图316上传到Linux平台的MongoDB安装包
在图316中,首先将MongoDB安装包的用户和用户组权限修改为user_mongo;然后将/opt/servers/目录下mongodb_demo目录的用户和用户组权限修改为user_mongo;最后解压MongoDB安装包至/opt/servers/mongodb_demo目录,具体命令如下: # 修改MongoDB安装包的用户和用户组权限
$ sudo chown user_mongo:user_mongo mongodb-linux-x86_64-rhel70-4.2.2.tgz
# 修改mongodb_demo文件夹的用户和用户组权限
$ sudo chown -R user_mongo:user_mongo /opt/servers/mongodb_demo/
# 解压安装包
$ tar -zxvf mongodb-linux-x86_64-rhel70-4.2.2.tgz -C /opt/servers/mongodb_demo/

执行上述命令,将MongoDB安装包进行解压,具体如图317所示。
图317解压MongoDB安装包在图317中,解压完MongoDB安装包后,进入到/opt/servers/mongodb_demo目录,如果觉得解压后的文件名过长,可以对文件进行重命名,具体命令如下:  # 重命名为mongodb
$ mv mongodb-linux-x86_64-rhel70-4.2.2 mongodb

执行上述命令后,查看修改名称后的MongoDB安装目录,具体如图318所示。
图318解压并重命名后的MongoDB文件夹
3. 配置MongoDB
(1) 通常情况下,MongoDB的数据文件存储在data目录的db目录下,日志文件存储在logs目录下,但是这两个目录在解压缩方式安装时不会自动创建。因此需要在mongodb目录下手动创建data目录和logs目录,并在data目录中创建db目录,在logs目录下创建一个mongologs.log日志文件,具体命令如下: # 创建数据文件存放目录
mkdir -p standalone/data/db/
# 创建日志文件存放目录
mkdir standalone/logs/
# 创建日志文件
touch standalone/logs/mongologs.log

执行上述命令后,在/mongodb/standalone目录下出现了data目录和logs目录。进入data目录下,可以看到数据文件存放目录db,如图319所示;进入logs目录下,可以看到日志文件mongologs.log,具体如图320所示。
图319db目录
图320mongologs.log日志文件
(2) 由于MongoDB的相关服务均存放在解压后/mongodb/bin目录下,若是想要启动MongoDB服务,必须在bin目录下启动,因此为了避免启动MongoDB服务之前进入到bin目录下,我们需要配置用户环境变量,即执行vi ~/.bash_profile命令打开并编辑.bash_profile文件,添加如下内容: # 配置用户环境变量
export PATH=/opt/servers/mongodb_demo/mongodb/bin:$PATH 

添加上述内容后,执行:wq命令,保存并关闭bash_profile文件,然后执行source ~/.bash_profile命令,使得修改后的.bash_profile文件生效。需要注意的是每次切换成user_mongo用户后,都需要执行source ~/.bash_profile命令初始化用户环境变量。
4. 启动MongoDB服务
启动MongoDB服务共有两种不同的方式,即使用命令行参数的方式和使用配置文件的方式,这两种启动方式的介绍如下: 
(1) 使用命令行参数的方式启动MongoDB服务。$ mongod --dbpath=/opt/servers/mongodb_demo/standalone/data/db/
--logpath=/opt/servers/mongodb_demo/standalone/logs/mongologs.log
--logappend -fork

上述命令中,mongod是MongDB服务;dbpath参数是指定数据文件存放的位置;logpath参数是指定日志文件的存放位置;logappend参数指定使用追加的方式写日志;fork参数指定以守护进程的方式(即后台)运行MongoDB服务。
执行上述命令,启动MongoDB服务,具体效果如图321所示。
图321启动MongoDB服务
在图321中,出现了successfully单词,则说明我们成功启动了MongoDB服务。
(2) 使用配置文件的方式启动MongoDB服务。
在使用配置文件的方式启动MongoDB服务之前,需要在mongodb目录下创建一个conf目录,用于存放MongoDB数据库的配置文件,并在该目录下新建文件mongod.conf,用于指定MongoDB服务启动所需要的一些参数。
创建conf目录,并在该目录下新建mongod.conf文件,具体命令如下: # 在mongodb目录下创建conf目录
$ mkdir conf/ 
# 在conf目录下新建mongod.conf文件
$ touch mongod.conf

执行上述命令后,效果如图322所示。
图322创建conf文件夹及mongod.conf文件
在图322中,即mongodb目录下执行vi conf/mongod.conf命令,打开并编辑mongod.conf文件,具体添加的内容如下: systemLog:
# MongoDB发送所有日志输出的目标指定为文件
# The Path of the log file to which mongos should send all diagnostic
#logging information
destination: file
# mongod发送所有诊断日志记录信息的日志文件的路径
path: "/opt/servers/mongodb_demo/standalone/logs/mongologs.log"
# 当mongod重启时,mongod会将新条目附加到现有日志文件的末尾
logAppend: true
storage:
# mongod数据文件存储的目录
dbPath: "/opt/servers/mongodb_demo/standalone/data/db/"
journal:
# 启用或禁用持久性日志,以确保数据文件保持有效和可恢复
enabled: true
processManagement:
# 启用在后台运行mongod进程的守护进程模式
fork: true

编辑上述内容需要注意的是MongoDB 3.0及以上版本的配置文件均采用YAML格式,其结构类似于大纲的缩排方式,开头使用空格作为缩进,数据结构为Map结构,即“Key: Value”,若是“: ”之后有Value,则后面必须增加一个空格;若是Key表示层级,则无须增加空格。按照层级结构,一级不需要空格缩进,二级缩进一或两个空格,三级缩进两个或四个空格,以此类推。
上述内容添加后,执行mongod f /opt/servers/mongodb_demo/mongodb/conf/mongod.conf命令,启动MongoDB服务,具体效果如图323所示。
图323启动MongoDB服务
在图323中,出现了successfully单词,则说明我们成功启动MongoDB服务。若是想要关闭MongoDB服务,则先执行ps ef | grep mongod命令,查看MongoDB的服务进程;然后执行kill 2  9670命令,结束MongoDB的服务进程(MongoDB的服务进程每次都不同,因此若是想要结束该进程,则必须在命令中提供对应的MongoDB进程号);再执行ps ef | grep mongod命令,查看MongoDB服务的进程是否存在,具体如图324所示。
图324关闭MongoDB服务
从图324中可以看出,第二次执行ps ef | grep mongod命令后,发现MongoDB的服务进程已经不存在了,因此说明我们成功关闭了MongoDB服务。
3.2数据库操作
MongoDB提供了一个交互式JavaScript接口,即mongo shell。mongo shell主要用于操作MongoDB,包括数据库、集合以及文档。本节将详细讲解如何使用mongo shell对MongoDB数据库进行新建、查看以及删除操作。
3.2.1新建数据库
创建数据库,具体语法如下: use DATABASE_NAME

上述语法中,use是用于创建和切换数据库的命令,若指定的数据库不存在,则创建数据库,否则切换到指定数据库。DATABASE_NAME是新建数据库或切换数据库的名称。
下面,我们来创建一个数据库articledb,用于存放文章的评论数据。首先,启动MongoDB服务,然后执行mongo命令,进入mongo shell中,效果如图325所示。
图325mongo shell界面在图325中,执行use articledb命令,创建数据库articledb,具体如下: > use articledb
switched to db articledb

从上述返回结果可以看出,数据库articledb已经创建完成。
3.2.2查看数据库
查看数据库,分为查看所有数据库和查看当前数据库两种情况,具体语法如下: # 查看所有数据库
show dbs
# 查看当前数据库
db

上述语法中,show是用于查看所有数据库的名称和存储情况的命令。dbs是databases的简称;db表示当前数据库对象。
接下来,分别演示执行show dbs和db命令,查看所有数据库和当前数据库。首先执行show dbs命令,查看所有数据库,具体如下: > show dbs
admin 0.000GB
config0.000GB
local 0.000GB

从上述返回结果可以看出,列出的数据库中没有出现数据库articledb,这是由于使用use命令创建的数据库articledb存储在内存中,并且数据库中没有任何数据,因此show dbs命令是查看不到的,但是我们可通过执行db命令来查看当前数据库articledb。需要注意的是,MongoDB中默认包含数据库admin、config、local及test,但是数据库test存储在内存中,也无任何数据,因此通过执行show dbs命令也是查看不到的。
执行db命令,查看当前的数据库,具体如下: > db
articledb

从上述返回结果可以看出,当前数据库为articledb。
3.2.3删除数据库
删除数据库,具体语法如下: db.dropDatabase()

上述语法中,db表示当前数据库对象;dropDatabase()是用于删除当前数据库的方法。执行db.dropDatabase()命令,删除当前数据库articledb,在执行删除数据库命令前,先确保已经切换到需要删除的数据库下,以免发生误删,具体如下: > db
articledb
> db.dropDatabase()
{ "ok" : 1 }

从上述返回结果"ok"可以看出,数据库articledb已经删除完毕。需要注意的是在执行删除数据库命令前,先确保已经切换到需要删除的数据库下,以免发生误删。
3.3集合操作
在前面章节中,我们使用mongo shell对数据库进行了基本的操作。本节将详细讲解如何使用mongo shell对集合进行创建和删除操作。
3.3.1创建集合
创建集合有两种方式,即显式创建集合和隐式创建集合,具体语法如下: # 显式创建集合
db.createCollection(COLLECTION_NAME, \[OPTIONS\])
# 隐式创建集合
db.COLLECTION_NAME.insert(DOCUMENT)

上述语法中,db表示当前数据库对象(在创建集合前应确保处于对应数据库下);createCollection(COLLECTION_NAME, [OPTIONS])是用于创建集合的方法,该方法中包含两个参数,参数COLLECTION_NAME表示要创建的集合名称;参数OPTIONS表示一个文档,用于指定集合的配置,该参数为可选参数。Insert(DOCUMENT)是用于往集合中插入文档的方法,该方法包含一个参数DOCUMENT,该参数表示文档。
下面,通过执行db.createCollection("myCollection")命令,演示如何显式创建集合myCollection,并执行show collections命令,查看是否成功创建集合,具体如下: > db.createCollection("myCollection")
{ "ok" : 1 }
> show collections
myCollection

从上述返回结果可以看出,集合myCollection创建成功了。关于隐式创建集合,这里先不作介绍,在3.4节中将进行详细介绍。
3.3.2删除集合
删除集合的具体语法如下: db.COLLECTION_NAME.drop()

上述语法中,db表示当前数据库对象;COLLECTION_NAME表示当前集合对象;drop()是用于删除集合的方法。
下面,通过执行db.myCollection.drop()命令演示如何删除集合myCollection,具体如下: > db.myCollection.drop()
true

从上述返回结果true可以看出,集合myCollection已被成功删除。
3.4文档的插入、更新与删除操作
在前面节中,我们使用mongo shell对数据库和集合进行了基本的操作。本节,我们将详细讲解如何使用mongo shell对文档进行插入、更新以及删除操作。
3.4.1文档插入
文档插入可以分为单文档插入和多文档插入,具体语法如下: # 单文档插入
db.COLLECTION_NAME.insert(document)

或db.COLLECTION_NAME.save(document)
# 多文档插入
db.COLLECTION_NAME.insertMany(\[document1,document2,...\])

上述语法中,对象、方法以及参数的详细介绍如下: 
 db表示当前数据库对象。
 COLLECTION_NAME表示当前集合对象。
 insert()和save()是用于插入文档的方法,这两个方法均包含参数document,该参数表示插入一个文档至集合中。insert()和save()方法的区别在于,若使用insert()方法插入文档,且集合中已存在该文档,则会报E11000 duplicate key error collection错误,反之则写入;若使用save()方法插入文档,且集合中已存在该文档,则会更新它,反之则写入。
 insertMany()是用于插入多个文档的方法,该方法包含参数[document1,document2,...],该参数是有多个文档组成的数组。
下面,演示执行插入单文档命令,先创建数据库articledb,再隐式创建集合comment,并在该集合中插入一个文档,具体命令如下: > use articledb
switched to db articledb

> db.comment.insert(
{"articleid":"100000","content":"今天天气真好,阳光明媚","userid":"1001",
"nickname":"Rose","age":"20","phone":"18807141995","createdatetime":new Date(),
 "likenum":NumberInt(10),"state":null}
 )
WriteResult({ "nInserted" : 1 })

从上述返回结果WriteResult({ "nInserted" :  1 })可以看出,我们成功将一个文档插入集合comment中。需要注意的是,MongoDB中的数字默认是Double类型的,若要存储整型,则需要使用函数“NumberInt(整型数字)”,否则查询就会出现问题;若集合中插入的文档没有指定_id,则会自动生成主键值ObjectId,ObjectId是使用12个字节的存储空间,由24个十六进制字符组成的字符串(每个字节可以存储两个十六进制字符),若某个键没有值,则可以赋值为null或者不写该键。执行db.comment.find()命令,查看集合comment中的内容,具体如下: > db.comment.find()
{ "_id" : ObjectId("5e175913ddb10619b13a001f"), "articleid" : "100000",
 "content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose",
"age":"20","phone":"18807141995","createdatetime":ISODate("2020-01-09T16:47:15.897Z"),
 "likenum" : 10, "state" : null }

从上述返回结果可以看出,集合comment中包含一个文档,该文档即为我们插入的文档。
接着,演示执行插入多文档命令,这里是往集合comment中插入6个文档,具体如下: > db.comment.insertMany(\[
{"_id":"1","articleid":"100001","content":"清晨,我们不该把时间浪费在手机上,健康很重要,
喝一杯温水,幸福你我他。","userid":"1002","nickname":"相忘于江湖","age":"25",
"phone":{"homePhone":"82174911","mobilePhone":"13065840128"},
"createdatetime":new Date("2020-01-02 09:08:15"),"likenum":NumberInt(1000),"state":"1"},
{"_id":"2","articleid":"100001","content":"我夏天空腹喝凉开水,冬天喝温开水",
"userid":"1003","nickname":"伊人憔悴","age":"22","phone":"13442031624",
"createdatetime":new Date("2020-01-02 10:20:40"),"likenum":NumberInt(888),"state":"1"},
{"_id":"3","articleid":"100001","content":"夏天和冬天,我都喝凉开水","userid":"1004",
"nickname":"杰克船长","age":"28","phone":"13937163334","createdatetime":
new Date("2020-01-02 14:56:09"),"likenum":NumberInt(666),"state":null},
{"_id":"4","articleid":"100001","content":"专家说不能空腹喝冰水,影响健康","userid":"1005",
"nickname":"罗密欧","age":"18","phone":"15813134403","createdatetime":
new Date("2020-01-03 11:26:29"),"likenum":NumberInt(2000),"state":"1"},
{"_id":"5","articleid":"100001","content":"研究表明,刚烧开的水千万不要喝,因为烫嘴",
"userid":"1005","nickname":"罗密欧","age":"18","phone":"15813134403",
"createdatetime":new Date("2020-01-03 15:10:37"),"likenum":NumberInt(3000),"state":"1"},
{"_id":"6","articleid":"100001","content":"喝水是生命体通过口腔摄入水分的方式,
人体每天通过口腔摄入的液体大约有2升","userid":"1006","nickname":"爱德华","age":"30",
"phone":{"homePhone":"62771541","mobilePhone":"13262984142"},
"createdatetime":new Date("2020-01-03 15:10:37"),"likenum":NumberInt(3000),"state":"1"}
\])

{
"acknowledged" : true,
"insertedIds" : \[
"1",
"2",
"3",
"4",
"5",
"6"
\]
}

从上述返回结果“"acknowledged" :  true”可以看出,我们成功将6个文档插入集合comment中,insertedIds表示插入多个文档的对应_id。执行db.comment.find()命令,查看集合comment中的内容,具体如下: > db.comment.find()
{ "_id" : ObjectId("5e162cca238207d6b5e1f585"), "articleid" : "100000",
"content":"今天天气真好,阳光明媚","userid":"1001","nickname":"Rose","age":"20",
"phone":"18807141995","createdatetime":ISODate("2020-01-08T19:26:02.544Z"),
"likenum":10,"state":null}
{"_id" :"1","articleid":"100001","content" : "清晨,我们不该把时间浪费在手机上,
健康很重要,喝一杯温水,幸福你我他。","userid":"1002","nickname":"相忘于江湖",
"age":"25","phone":{"homePhone":"82174911","mobilePhone":"13065840128"},
"createdatetime":ISODate("2020-01-02T01:08:15Z"),"likenum":1000,"state":"1"}
{"_id":"2","articleid":"100001","content":"我夏天空腹喝凉开水,冬天喝温开水",
"userid":"1003","nickname":"伊人憔悴","age":"22","phone":"13442031624",
"createdatetime":ISODate("2020-01-02T02:20:40Z"),"likenum":888,"state":"1"}
{"_id":"3","articleid":"100001","content":"夏天和冬天,我都喝凉开水","userid": "1004",
"nickname":"杰克船长","age":"28","phone":"13937163334","createdatetime":
ISODate("2020-01-02T06:56:09Z"),"likenum":666,"state":null}
{"_id":"4","articleid":"100001","content":"专家说不能空腹喝冰水,影响健康", "userid" : "1005",
"nickname":"罗密欧","age":"18","phone":"15813134403","createdatetime":
ISODate("2020-01-03T03:26:29Z"),"likenum": 2000, "state" : "1"}
{"_id":"5","articleid":"100001","content":"研究表明,刚烧开的水千万不要喝,因为烫嘴",
"userid":"1005","nickname":"罗密欧","age":"18","phone":"15813134403",
"createdatetime":ISODate("2020-01-03T07:10:37Z"),"likenum" : 3000, "state" : "1" }
{"_id":"6","articleid":"100001","content":"喝水是生命体通过口腔摄入水分的方式,
人体每天通过口腔摄入的液体大约有2升","userid":"1006","nickname":"爱德华",
"age":"30","phone":{"homePhone":"62771541","mobilePhone": "13262984142" },
"createdatetime":ISODate("2020-01-03T07:10:37Z"),"likenum":3000,"state":"1"}

从上述返回结果可以看出,集合comment中存在7个文档,包含第一次插入的单个文档和第二次插入的6个文档。
3.4.2文档更新
更新文档的具体语法如下: db.COLLECTION_NAME.update(criteria,objNew,upsert, multi)