学习笔记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:
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(
{
}
).pretty()
# 小于操作符$lt
db.COLLECTION_NAME.find(
{
}
).pretty()
# 大于等于操作符$gte
db.COLLECTION_NAME.find(
{
}
).pretty()
# 小于等于操作符$lte
db.COLLECTION_NAME.find(
{
}
).pretty()
# 不等于操作符$ne
db.COLLECTION_NAME.find(
{
}
).pretty()
# 包含操作符$in
db.COLLECTION_NAME.find(
{
}
).pretty()
# 不包含操作符$nin
db.COLLECTION_NAME.find(
{
}
).pretty()
5.3 按特定类型查询文档
按特定类型查询文档,主要分为Null类型查询、正则表达式查询、嵌套文档查询和数组查询等。其中,嵌套文档查询包括精确匹配查询和点查询。
# Null类型查询,用于查询集合中字段值为Null的文档
db.COLLECTION_NAME.find({
# 正则表达式查询,用于查询集合中符合某个规则的文档
db.COLLECTION_NAME.find({
# 嵌套文档查询之精准匹配查询,用于在集合中指定子文档,查询符合条件的文档
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: {
}
}]).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([{
管道操作符: {
$avg: $
}
}
}]).pretty()
# $min表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
$min: $
}
}
}]).pretty()
# $max表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
$max: $
}
}
}]).pretty()
# $push表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
$push: $
}
}
}]).pretty()
# $first表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
$first: $
}
}
}]).pretty()
# $last表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
$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函数的文档数量。
文章链接
发表评论