学习笔记5:MongoDB的基本使用
1、服务启动与关闭
1.1 服务的启动
在命令行窗口windows + r
输入以下命令即可启动服务:
mongod -f [mongod.conf配置文件的路径]
在我的电脑上使用 mongod -f ../conf/mongod.conf
即可启动服务。
tips:
将MongoDB
的压缩包解压后应该会有个bin
文件夹,需要在该文件夹下执行上述命令,否则会提示当前命令不存在。
1.2 服务的关闭
启动服务成功后,命令行窗口的光标的一直闪动,此时关闭命令行窗口即可关闭服务。
2、数据库操作
MongoDB
提供了一个交互式JavaScript接口,即 mongo shell
。在mongo shell
中可以通过命令操作MongoDB
,包括数据库、集合以及文档。
2.1 新建数据库
创建数据库,具体语法如下:
use DATABASE_NAME
use
是用于创建和切换数据库的命令,若指定的数据库不存在,则创建数据库,否则切换到指定数据库。
2.2 查看数据库
查看数据库,分为查看所有数据库和查看当前数据库两种,具体语法如下:
# 查看所有数据库
show dbs
# 查看当前数据库
db
需要注意的是,当使用use
命令创建数据库时,此时的数据库存储在内存中,使用show dbs
命令无法查看到。但是使用db
命令可以查看到。当在数据库中插入集合collection
后就能够使用show dbs
查看到。
2.3 删除数据库
删除数据库,具体语法如下:
db.dropDatabase()
db
表示当前数据库,dropDatabase()
是用于删除当前数据库的方法。
删除数据库时需要确保已经切换到需要删除的数据库下,以免发生误删。
3、集合操作
3.1 创建集合
创建集合有两种方式,即显式创建集合和隐式创建集合,具体语法如下:
# 显式创建集合
db.createCollection(COLLECTION_NAME, [OPTIONS])
# 隐式创建集合
db.COLLECTION_NAME.insert(DOCUMENT)
参数OPTIONS
表示一个文档,用于指定集合的配置,该参数为可选参数。
Insert(DOCUMENT)
是用于往集合中插入文档的方法,该方法包含一个参数DOCUMENT
,该参数表示文档。
3.2 删除集合
删除集合的具体语法如下:
db.COLLECTION_NAME.drop()
3.3 查看集合
查看当前数据库中所有的集合,具体语法如下:
show collections
4、文档的插入、更新与删除操作
4.1 文档插入
文档插入可以分为单文档插入和多文档插入,具体语法如下:
# 单文档插入
db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.save(document)
# 多文档插入
db.COLLECTION_NAME.insertMany([document1,document2,...])
insert()
和save()
方法都是用于单文档插入的方法。区别在于:
insert()
方法插入文档时,若集合中存在该文档,则会报E11000 duplicate key error collection
错误,反之则写入。save()
方法插入文档时,若集合中存在该文档,则会更新它,反之则写入。
insertMany()
是用于插入多个文档的方法,该方法的参数是一个由多个文档组成的数组。
需要注意的是:
MongoDB
中的数字默认是Double
类型的,若要存储整型,则需要使用函数NumberInt(整型数字)
,否则查询就会出现问题。- 若集合中插入的文档没有指定
_id
,则会自动生成主键值ObjectId
,ObjectId
是使用12个字节的存储空间,由24个十六进制字符组成的字符串(每个字节可以存储两个十六进制字符)。 - 若某个键没有值,则可以赋值为
null
或者不写该键。
4.2 文档更新
更新文档的具体语法如下:
db.COLLECTION_NAME.update(criteria, objNew, upsert, multi)
方法中的参数介绍如下:
criteria
:该参数表示更新的查询条件,类似于sql
更新查询中where
后面的条件,主要用于匹配文档。objNew
:该参数表示更新的对象和一些更新的操作符等,也可以理解为sql
更新查询中set
后面的条件。upsert
:在不存在更新文档的情况下(根据参数criteria
未找到文档),该参数用于判断是否插入objNew
,若为true
,则插入,默认为false
,不插入。该参数为可选参数。multi
:该参数默认为false
,只更新找到的第一个文档;若这个参数为true
,则将按条件查出来的多个文档都更新。该参数为可选参数。
4.3 文档删除
删除文档的具体语法如下:
# 删除单个文档
db.COLLECTION_NAME.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
# 删除所有文档
db.COLLECTION_NAME.remove({})
参数介绍如下:
<query>
:该参数为可选参数,其表示删除文档的条件。{justOne:<boolean>, writeConcern: <document>}
:该参数为可选参数,其中参数介绍如下:justOne: <boolean>
:boolean为true或者1时,表示查询到多个文档时只删除找到的第一个文档。writeConcern: <document>
:表示抛出异常的级别。
5、文档简单查询
5.1 查询所有文档
查询所有文档的具体语法如下:
# 查询所有文档
db.COLLECTION_NAME.find()
# 查询所有文档,返回结果以易读的方式展示出来
db.COLLECTION_NAME.find().pretty()
5.2 按条件查询文档
按条件查询文档,主要分为逻辑操作符查询文档和比较操作符查询文档等。
- 逻辑操作符:与
$and
、或$or
- 比较操作符:大于
$gt
、小于$lt
、大于等于$gte
、小于等于$lte
、不等于$ne
、包含$in
、不包含$nin
具体语法如下:
# 与操作符$and
db.COLLECTION_NAME.find(
{$and:[
{<key1>: <value1>,
<key2>: <value2>,
...
}
]}
).pretty()
# 或操作符$or
db.COLLECTION_NAME.find(
{$or:[
{<key1>: <value1>,
<key2>: <value2>,
...
}
]}
).pretty()
# 大于操作符$gt
db.COLLECTION_NAME.find(
{
<key>: {$gt: <value>}
}
).pretty()
# 小于操作符$lt
db.COLLECTION_NAME.find(
{
<key>: {$lt: <value>}
}
).pretty()
# 大于等于操作符$gte
db.COLLECTION_NAME.find(
{
<key>: {$gte: <value>}
}
).pretty()
# 小于等于操作符$lte
db.COLLECTION_NAME.find(
{
<key>: {$lte: <value>}
}
).pretty()
# 不等于操作符$ne
db.COLLECTION_NAME.find(
{
<key>: {$ne: <value>}
}
).pretty()
# 包含操作符$in
db.COLLECTION_NAME.find(
{
<key>: {$in: [<value1>, <value2>, ...]}
}
).pretty()
# 不包含操作符$nin
db.COLLECTION_NAME.find(
{
<key>: {$nin: [<value1>, <value2>, ...]}
}
).pretty()
5.3 按特定类型查询文档
按特定类型查询文档,主要分为Null类型查询、正则表达式查询、嵌套文档查询和数组查询等。其中,嵌套文档查询包括精确匹配查询和点查询。
# Null类型查询,用于查询集合中字段值为Null的文档
db.COLLECTION_NAME.find({<key>: null}).pretty()
# 正则表达式查询,用于查询集合中符合某个规则的文档
db.COLLECTION_NAME.find({<key>: /正则表达式/}).pretty()
# 嵌套文档查询之精准匹配查询,用于在集合中指定子文档,查询符合条件的文档
db.COLLECTION_NAME.find({
<key>: {
<key1>: <value1>,
<key2>: <value2>,
...
}
}).pretty()
# 嵌套文档查询之点查询,用于在集合中指定子文档中一个字段,查询包含该字段的文档
db.COLLECTION_NAME.find({
<key>.<key1>: <value1>
}).pretty()
6、聚合操作
- 聚合管道操作:将文档在一个管道处理完毕后,把处理的结果传递给下一个管道进行再次处理。
- Map-Reduce操作:将集合中的批量文档进行分解处理,然后将处理后的各个结果进行合并输出。
6.1 聚合管道操作
常见管道操作符 | 相关说明 |
---|---|
$group | 将集合中的文档进行分组,便于后续统计结果 |
$limit | 用于限制MongoDB 聚合管道返回的文档数 |
$match | 用于过滤数据,只输出符合条件的文档 |
$sort | 将输入的文档先进行排序,再输出 |
$project | 用于修改输入文档的结构(增加、删除字段等)和名称 |
$skip | 再聚合管道中跳过指定数量的文档,并返回剩余的文档 |
具体语法如下:
# $group操作符
db.COLLECTION_NAME.aggregate([{
$group: {
<key>: "$<key1>"
}
}]).pretty()
# $limit操作符
db.COLLECTION_NAME.aggregate({
$limit: 整型数字
}).pretty()
# $match操作符
db.COLLECTION_NAME.aggregate([{
$match: {
<key>: <value>
}
}]).pretty()
# $sort操作符,-1表示降序,1表示升序
db.COLLECTION_NAME.aggregate([{
$sort: {
<key>: -1 或 1
}
}]).pretty()
# $project操作符
db.COLLECTION_NAME.aggregate([{
$project: {
<key>: <value>
}
}]).pretty()
# $skip操作符
db.COLLECTION_NAME.aggregate({
$skip: 整型数字
}).pretty()
常见管道表达式 | 相关说明 |
---|---|
$sum | 计算总和 |
$avg | 计算平均值 |
$min | 获取集合中所有文档对应值的最小值 |
$max | 获取集合中所有文档对应值的最大值 |
$push | 在结果文档中插入值到一个数组中 |
$first | 获取分组文档中的第一个文档 |
$last | 获取分组文档中的最后一个文档 |
具体语法如下:
# $sum表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
<key1>: "$<key2>",
<key3>: {
$sum: $<key4>
}
}
}]).pretty()
# $avg表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
<key1>: "$key2",
<key3>: {
$avg: $<key4>
}
}
}]).pretty()
# $min表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
<key1>: "$key2",
<key3>: {
$min: $<key4>
}
}
}]).pretty()
# $max表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
<key1>: "$key2",
<key3>: {
$max: $<key4>
}
}
}]).pretty()
# $push表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
<key1>: "$key2",
<key3>: {
$push: $<key4>
}
}
}]).pretty()
# $first表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
<key1>: "$key2",
<key3>: {
$first: $<key4>
}
}
}]).pretty()
# $last表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
<key1>: "$key2",
<key3>: {
$last: $<key4>
}
}
}]).pretty()
6.2 Map-Reduce操作
Map-Reduce操作有两个阶段,即Map阶段和Reduce阶段。
- Map阶段:对集合中的每个输入文档进行处理,处理结束后输出一个或多个结果
- Reduce阶段:将Map阶段输出的一个或多个结果进行合并输出
操作流程:
Map-Reduce操作先按条件进行查询操作,将集合中满足条件的文档查询出来,然后将这些满足条件的文档输入到Map阶段中,并按key进行分组,将key相同的文档的value存放到一个数组中,输出到Reduce阶段进行聚合处理。
具体语法如下:
db.COLLECTION_NAME.mapReduce(
function(){
emit(key,value); //map函数
},
function(key,values){
return reduceFunction //reduce函数
},
{
query: 条件,
out: New_COLLECTION_NAME,
sort: 条件,
limit: number
}
)
函数和参数介绍如下:
map
映射函数调用emit(key, value)
方法,遍历集合中的所有文档,返回key-value
键值对,并将key
和value
输入到reduce
统计函数中。reduce
统计函数主要是将key-values
变成key-value
,即将values
数组变成单一的值value
。- 参数分别为
query
、out
、sort
以及limit
。- query参数的值为条件,主要用于筛选文档,满足条件的文档才会调用map函数。
- out参数的值为集合,用于存放聚合统计后的结果(若不指定集合则使用临时集合,客户端断开后自动删除)。
- sort参数为可选项,一般结合limit参数使用,在满足条件的文档输入map函数之前进行排序操作。
- limit参数为可选项,用于限定输入map函数的文档数量。