学习笔记5:MongoDB的基本使用

学习笔记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,则会自动生成主键值ObjectIdObjectId是使用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>: -11
	}
}]).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键值对,并将keyvalue输入到reduce统计函数中。reduce统计函数主要是将key-values变成key-value,即将values数组变成单一的值value
  • 参数分别为queryoutsort以及limit
    • query参数的值为条件,主要用于筛选文档,满足条件的文档才会调用map函数。
    • out参数的值为集合,用于存放聚合统计后的结果(若不指定集合则使用临时集合,客户端断开后自动删除)。
    • sort参数为可选项,一般结合limit参数使用,在满足条件的文档输入map函数之前进行排序操作。
    • limit参数为可选项,用于限定输入map函数的文档数量。
  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值