学习笔记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(

,

{

justOne: ,

writeConcern:

}

)

# 删除所有文档

db.COLLECTION_NAME.remove({})

参数介绍如下:

:该参数为可选参数,其表示删除文档的条件。{justOne:, writeConcern: }:该参数为可选参数,其中参数介绍如下:

justOne: :boolean为true或者1时,表示查询到多个文档时只删除找到的第一个文档。writeConcern: :表示抛出异常的级别。

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:[

{: ,

: ,

...

}

]}

).pretty()

# 或操作符$or

db.COLLECTION_NAME.find(

{$or:[

{: ,

: ,

...

}

]}

).pretty()

# 大于操作符$gt

db.COLLECTION_NAME.find(

{

: {$gt: }

}

).pretty()

# 小于操作符$lt

db.COLLECTION_NAME.find(

{

: {$lt: }

}

).pretty()

# 大于等于操作符$gte

db.COLLECTION_NAME.find(

{

: {$gte: }

}

).pretty()

# 小于等于操作符$lte

db.COLLECTION_NAME.find(

{

: {$lte: }

}

).pretty()

# 不等于操作符$ne

db.COLLECTION_NAME.find(

{

: {$ne: }

}

).pretty()

# 包含操作符$in

db.COLLECTION_NAME.find(

{

: {$in: [, , ...]}

}

).pretty()

# 不包含操作符$nin

db.COLLECTION_NAME.find(

{

: {$nin: [, , ...]}

}

).pretty()

5.3 按特定类型查询文档

按特定类型查询文档,主要分为Null类型查询、正则表达式查询、嵌套文档查询和数组查询等。其中,嵌套文档查询包括精确匹配查询和点查询。

# Null类型查询,用于查询集合中字段值为Null的文档

db.COLLECTION_NAME.find({: null}).pretty()

# 正则表达式查询,用于查询集合中符合某个规则的文档

db.COLLECTION_NAME.find({: /正则表达式/}).pretty()

# 嵌套文档查询之精准匹配查询,用于在集合中指定子文档,查询符合条件的文档

db.COLLECTION_NAME.find({

: {

: ,

: ,

...

}

}).pretty()

# 嵌套文档查询之点查询,用于在集合中指定子文档中一个字段,查询包含该字段的文档

db.COLLECTION_NAME.find({

.:

}).pretty()

6、聚合操作

聚合管道操作:将文档在一个管道处理完毕后,把处理的结果传递给下一个管道进行再次处理。Map-Reduce操作:将集合中的批量文档进行分解处理,然后将处理后的各个结果进行合并输出。

6.1 聚合管道操作

常见管道操作符相关说明$group将集合中的文档进行分组,便于后续统计结果$limit用于限制MongoDB聚合管道返回的文档数$match用于过滤数据,只输出符合条件的文档$sort将输入的文档先进行排序,再输出$project用于修改输入文档的结构(增加、删除字段等)和名称$skip再聚合管道中跳过指定数量的文档,并返回剩余的文档

具体语法如下:

# $group操作符

db.COLLECTION_NAME.aggregate([{

$group: {

: "$"

}

}]).pretty()

# $limit操作符

db.COLLECTION_NAME.aggregate({

$limit: 整型数字

}).pretty()

# $match操作符

db.COLLECTION_NAME.aggregate([{

$match: {

:

}

}]).pretty()

# $sort操作符,-1表示降序,1表示升序

db.COLLECTION_NAME.aggregate([{

$sort: {

: -1 或 1

}

}]).pretty()

# $project操作符

db.COLLECTION_NAME.aggregate([{

$project: {

:

}

}]).pretty()

# $skip操作符

db.COLLECTION_NAME.aggregate({

$skip: 整型数字

}).pretty()

常见管道表达式相关说明$sum计算总和$avg计算平均值$min获取集合中所有文档对应值的最小值$max获取集合中所有文档对应值的最大值$push在结果文档中插入值到一个数组中$first获取分组文档中的第一个文档$last获取分组文档中的最后一个文档

具体语法如下:

# $sum表达式

db.COLLECTION_NAME.aggregate([{

管道操作符: {

: "$",

: {

$sum: $

}

}

}]).pretty()

# $avg表达式

db.COLLECTION_NAME.aggregate([{

管道操作符: {

: "$key2",

: {

$avg: $

}

}

}]).pretty()

# $min表达式

db.COLLECTION_NAME.aggregate([{

管道操作符: {

: "$key2",

: {

$min: $

}

}

}]).pretty()

# $max表达式

db.COLLECTION_NAME.aggregate([{

管道操作符: {

: "$key2",

: {

$max: $

}

}

}]).pretty()

# $push表达式

db.COLLECTION_NAME.aggregate([{

管道操作符: {

: "$key2",

: {

$push: $

}

}

}]).pretty()

# $first表达式

db.COLLECTION_NAME.aggregate([{

管道操作符: {

: "$key2",

: {

$first: $

}

}

}]).pretty()

# $last表达式

db.COLLECTION_NAME.aggregate([{

管道操作符: {

: "$key2",

: {

$last: $

}

}

}]).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函数的文档数量。

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。