MongoDB基本操作

前言

MongoDB是一种非关系型数据库。所谓 NoSQL ,并不是指没有 SQL ,而是指“Not Only SQL ”,即非传统关系型数据库。这类数库的主要特点包括非关系型、水平可扩展、分布式与开源。另外它还具有模式自由、最终一致性。

一、MongoDB简介

1.简介

MongoDB是属于NoSql的一种数据类型。MongoDB是一款强大、灵活、且易于扩展的通用型数据库。
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨再为WEB引用提供可扩展的高性能数据存储解决方案,将数据存储为一个文档(类似JSON对象),数据结构由键值(key=>value)对组成支持丰富的查询表达,可以设置任何属性的索引;支持副本集、分片。
它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。

(1)其使用文档来替代关系型数据库表的结构,每条数据不在要求其有无和一致性的类型。
(2)每个文档可以具备丰富的层次结构,而不是并列的属性数据。当然对于检索等情况下也不是很建议这样处理。
(3)使用横向扩展技术,面向文档的数据模型更易扩展。
(4)具备更加丰富、独特、易用的检索功能。
(5)基于内存的储存检索,性能更佳。

2.MongoDB特点

1、数据文件存储格式为 BSON (JSON 的扩展)。{“name”:“joe”}这是 BSON 的例子,其中"name"是键,"joe"是值。键值对组成了 BSON 格式。
2、面向集合存储,易于存储对象类型和 JSON 形式的数据。所谓集合(collection)有点类似一张表格,区别在于集合没有固定的表头。
3、模式自由。一个集合中可以存储一个键值对的文档,也可以存储多个键值对的文档,还可以存储键不一样的文档,而且在生产环境下可以轻松增减字段而不影响现有程序的运行。
4、支持动态查询。mongodb 支持丰富的查询表达式,查询语句使用 JSON 形式作为参数,可以很方便地查询内嵌文档和对象数组。
5、完整的索引支持。文档内嵌对象和数组都可以创建索引。
6、支持复制和故障恢复。mongodb数据库从节点可以复制主节点的数据,主节点所有对数据的操作都会同步到从节点,从节点的数据和主节点的数据是完全一样的,以作备份。当主节点发生故障之后,从节点可以升级为主节点,也可以通过从节点对故障的主节点进行数据恢复。
7、二进制数据存储。mongodb使用传统高效的二进制数据存储方式,可以将图片文件甚至视频转换成二进制的数据存储到数据库中。
8、自动分片。自动分片功能支持水平的数据库集群,可动态添加机器。分片的功能实现海量数据的分布式存。
9、支持多种语言。支持 C++、 C#、 Erlang、Haskell、JavaScript、Java、Perl、PHP、Python、Ruby、Scala 等开发语言。
10、mongodb使用的是内存映射存储引擎。mongodb会把磁盘 IO 操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用;如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。这也是mongodb快的原因。坏处是没有办法很方便地控制 mongodb占多大内存,mongodb会占用所有能用的内存,所以最好不要把别的服务和mongodb放在同一台服务器部署。

二、 MongoDB教程

1.数据库操作

新建数据库:

use DATABASE_NAME

use:用于切换/创建数据库,若不存在则创建,否则切换到指定数据库
DATABASE_NAME:数据库名称

执行use articledb命令,创建数据库articledb

查看数据库:

show dbs

或者查看当前数据库,需要先切换到指定数据库

db

删除数据库:

db.dropDatabase()

db:表示当前数据库对象
dropDatabase():用于删除当前数据库的方法

删除当前数据库,执行命令前应使用use命令切换到要删除的数据库,为了防止误删可执行命命 令db验证 当前数据库是否为指定删除的数据库。

2.创建集合:

显示创建

db.createCollection(COLLECTION_NAME, [OPTIONS])
db.COLLECTION_NAME.insertMany([document1,document2,...])
db.COLLECTION_NAME.insert(DOCUMENT)

db:表示当前数据库对象
createCollection():创建集合方法
DOCUMENT表示文档
COLLECTION_NAME表示集合名称
OPTIONS表示集合配置
insert():向集合中插入文档的方法

删除集合:

db.COLLECTION_NAME.drop()

db:表示当前数据库对象
COLLECTION_NAME:表示集合名称
drop():删除集合方法

3.文档插入:

db.COLLECTION_NAME.insert(document)

或者

db.COLLECTION_NAME.save(document)

多文档插入:

db.COLLECTION_NAME.insertMany([document1,document2,...])

db:当前数据库对象
COLLECTION_NAME:当前集合对象
insert()和save():插入单文档方法
insertMany():插入多文档方法

insert()和save()方法的区别在于,若使用insert()方法插入文档时,集合中已存在该文档,则会报 错。若使用save()方法插入文档时,集合中已存在该文档,则会覆盖。

4.文档更新:

db.COLLECTION_NAME.update(criteria,objNew,upsert, multi)

db:当前数据库对象
COLLECTION_NAME:当前集合对象
update():更新文档方法
criteria:更新的查询条件,类似sql中的where
objNew:新的对象和操作符,类似sql中的set
upsert:不存在更新对象时,是否插入,默认为false multi:默认为false,只更新查找到的第一 个文档,反之更新所有

升级语法:

db.集合名.update(条件, 新数据){修改器: {:}}
修改器作用
$inc递增
$rename重命名列
$set修改列值
$unset删除列

5.文档删除:

删除单个:

db.COLLECTION_NAME.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)

删除全部文档:

db.COLLECTION_NAME.remove({})

db:当前数据库对象
COLLECTION_NAME:当前集合对象
remove():删除文档方法
query:删除文档的条件,可选参数
justOne:的boolean为true或1时,表示只删除查询出的第一个文档
writeConcern: 表示抛出异常级别

6.文档简单查询:

查询所有文档语法:

db.COLLECTION_NAME.find()

查询所有文档,以易读的方式展示:

db.COLLECTION_NAME.find().pretty()

db:当前数据库对象
COLLECTION_NAME:当前集合对象
find():查询所有文档方法
pretty():格式化查询返回结果

按条件查询文档:
基础语法:db.集合名.find(条件 [查询的列]):

查询所有数据 {}或者不写
查询age=6的数据 {age:6}
既要age=6又要性别={age:6,sex:'男'}
查询的列(可选参数
不写 - 这查询全部列(字段
{age:1} 只显示age列(字段
{age:0} 除了age列(字段都显示
留心:不管你怎么写系统自定义的_id都会在

升级语法:

运算符作用
$gt大于
$gte大于等于
$lt小于
$lte小于等于
$ne不等于
$inin
$ninnot in

三、聚合操作

聚合管道操作是将文档在一个管道处理完毕后,把处理的结果传递给下一个管道进行再次处理。聚合管 道是使用不同的管道阶段操作器进行不同聚合操作,管道阶段操作器也可称为管道操作符,常见管道操 作符如下表

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

语法:

db.集合名称.aggregate([
{管道:{表达式}}
....
])

常用表达式:
管道阶段操作器的值被称为管道表达式,并且每个管道表达式都是一个文档结构,由字段名称、字段值 和管道表达式组成。常见的管道表达式如下表

常见管道表达式相关说明
$sum用于计算总和 s u m : 1 同 c o u n t 表示统计这里没有 c o u n t ,使用 sum:1同count表示统计 这里没有count,使用 sum:1count表示统计这里没有count,使用sum:1表示
$avg计算平均值
$min获取集合中所有文档对应值的最小值
$max获取集合中所有文档对应值的最大值
$push用于在结果文档中插入值到一个数组中
$first获取分组文档中的第一个文档
$last获取分组文档中的最后一个文档

四、索引

MongoDB数据库提供了多样性的索引支持,因此可以提高查询集合中文档的效率。若是没有索引, MongoDB数据库必须执行全集合扫描(即扫描集合中的每一个文档),从而筛选出与查询条件相匹配 的文档。这种扫描全集合的查询效率是非常低的,尤其是在处理海量数据时,执行查询操作需要花费几 十秒甚至几分钟的时间,这无疑对网站的性能是非常致命的。若是执行查询操作时,集合中的文档存在 适当的索引,MongoDB就可以使用该索引限制必须检查的文档数量。
索引是一种特殊的数据结构,即采用B-Tree数据结构。索引是以易于遍历读取的形式存储着集合中文 档的一小部分,文档的一小部分指文档中的特定字段或一/多组字段,并且这些字段均按照字段的值进 行排序。索引项的排序支持有效的等值匹配和基于范围的查询操作。此外,MongoDB还可以使用索引 中的排序返回排序的结果。

1.单字段索引:

MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,因此被称为单字段索引(Single Field Index)。默认情况下,MongoDB中所有集合在“_id”字段上都有一个索引,用户也可以根据自己 的需求添加额外索引来支持重要的查询和操作。由于MongoDB可以从任何方向遍历索引,因此对于单 个字段索引和排序操作来说,索引项的排序顺序(即升序或降序)并不重要。

2.复合索引:

MongoDB除了支持单字段索引外,还支持复合索引。所谓复合索引,就是包含多个字段的索引,一个 复合索引最多可以包含31个字段。需要注意的是,若某字段属于哈希索引,则这时复合索引就不能包括 该字段。

3.多键索引:

若文档中的字段为数组类型,则每个字段都是数组中的一个元素,MongoDB将会为数组中的每个元素 创建索引,因此被称为多键索引(Multikey Index)。多键索引允许通过匹配数组的一个或多个元素来 查询包含该数组的文档。如果索引字段包含数组值,则MongoDB会自动确定是否创建多键索引,而无 需显式地指定创建多键索引。

4.查看索引:

语法:

db.COLLECTION_NAME.getIndexes()

查看索引大小:

db.COLLECTION_NAME.totalIndexSize()

创建索引:

db.COLLECTION_NAME.createIndex(keys,options)

keys:指定索引键及排序顺序,该参数值为文档类型,key用于指定索引键,value指定排序顺序,1为 升序,-1为降序
options:用于控制创建索引的选项,常见选项有unique和name,其中unique描述建立的索引是否唯 一,默认为false。name描述所创建索引的名称,默认情况下MongoDB会通过连接索引的字段名和排 序顺序生成一个索引名称

5.删除索引:

db.COLLECTION_NAME.dropIndexes()

删除单个索引:

db.COLLECTION_NAME.dropIndex(index)

参数index,其数据类型为字符串或文档,可用于指定要删除的索引

  • 36
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值