1.数据库操作
1.1选择和创建数据库的语法格式:
# 如果数据库不存在则自动创建,存在则选中指定数据库
use 数据库名称
# 查看有权限查看的所有数据库
show dbs
show databases
# 查看当前已选中的数据库
db
注意:在MongoDB中,集合只有在内容插入后才会创建!就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
MongoDB中默认的数据库为test,如果你没有选择数据库,集合将存放在test数据库中。
1.2数据库的删除
# MongoDB删除当前正在使用数据库的语法格式如下
db.dropDatabase()
提示:主要用来删除已经持久化的数据库,删除的是当前所在的库。
2.集合操作
集合,类似于关系型数据库中的表。
# 显式创建集合
db.createCollection(集合名称)
# 集合的隐式创建
当向集合中插入一个文档,如果文档不存在,就会自动创建集合。
# 查询当前使用的库中所有存在的集合
show collections
# 删除集合,成功为true,反之false
db.collection_name.drop()
3.文档基本crud
文档的数据结构和json基本一样。所有存储在集合中的数据都是BSON格式。
3.1 文档的插入【增】
- 单个文档插入
# 使用insert()或save()方法向集合中插入文档。
db.collection.insert(
<document or array of documents>,
{
writeConcern:<document>,
ordered:<boolean>
}
)
例如:db.test.insert({"name":"小明","age":"18"})
返回WriteResult({"nInserted" : 1})
,则说明插入一条数据成功。
提示:
1.集合如果不存在,则会隐式创建
2.mongo中的数字,默认情况下是duuble
类型,如果要存整型,必须使用函数NumberInt(整型数字)
,否则取出来就有问题。
3.插入当前日期使用new Date()
4.插入的数据没有指定_id
会自动生成主键值
5.如果某字段没值,可以赋值为null
,或不写该字段。
- 批量插入
# 一个大数组,包含多个json对象
db.collection.insertMany(
[<document 1>,<document 2>,...],
{
writeConcern:<document>,
ordered:<boolean>
}
)
示例:
3.2文档的基本【查询】
查询数据的语法格式如下:
db.collection.find(<query>,[projection])
参数:
基本查询
【示例1】查询集合中所有文档
db.collection_name.find()
或db.collection_name.find({})
这里每条文档会有个交_id的字段,这个相当于我们原来关系型数据库中表的主键,当你在插入文档记录时没有指定该字段,MongoDB会自动创建,其类型是ObjectID类型。
【示例2】条件查询集合中的文档
在find()中添加参数即可,参数也是json格式,如下:
db.collection_name.find({"key":value})
如果需要返回符合条件的第一条数据,我们可以使用findOne
命令来实现,语法跟find一样
投影查询
如果要查询机构返回部分字段,则需要使用投影查询(不现实所有字段,只显示指定的字段)。
如果查询全部,只显示部分字段,该字段用json格式1表示。默认_id
要显示,如果想排除_id
则跟上_id:0
3.3文档的分页【查询】
统计查询
统计查询试用版count()方法,语法如下:
db.collection_name.count(query,options)
参数:
(1)统计所有记录数
(2)按条件统计记录数
例如:统计id为1的记录数
分页列表查询
可以使用limit()
方法来读取指定数量的数据,使用skip()
方法来跳过指定数量的数据。
基本语法如下:
# skip和limit两个函数可以换位置。相当于mysql的limit(number2,number1)
db.collection_name.find().limit(分页大小).skip(跳过指定条数文档)
1、如果想返回指定的记录,可以在find后面用limit来返回结果(top N),默认前20条
db.collection_name.find().limit(5); //返回前5条记录数。
2、skip方法同样接受一个数字参数作为跳过的记录条数,(前N个不要),默认是0
db.collection_name.find().skip(3); //跳过前3条记录,返回后面的记录。
3.分页查询
db.collection_name.find().limit(number1).skip(number2) //跳过前number2条记录,返回number1条记录
4.排序查询
sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用1和-1来指定排序的方式。
- 1:升序
- -1:降序
语法如下:
db.collection_name.find().sort({key:1})
文档的更多查询
1.正则的复杂条件查询
2.比较查询
3.包含查询
4.条件连接查询
3.4 文档【更新】
# 文档更新语法:
db.collection_name.update(query,update,options)
//或
db.collection.update(
<query>,
<update>,
{
upsert:<boolean>,
multi:<boolean>,
writeConcern:<document>,
arrayFilters:[<filterdocument1>,....],
hint:<document|string> //available starting in mongodb 4.2
}
)
【示例】
1.覆盖性质的修改(慎用)
执行db.collection_name.update({"_id":"1"},{"name":"xxx"})
后,name字段外其他字段都不在了。
2.局部的修改
为了解决上面问题,使用修改器$set
来实现。
执行db.collection_name.update({"_id":"2"},{$set:{"name":"xxxx"}})
,只修改该文档的name字段的值,不会出现其他字段消失。
3.批量修改
例:更新所有cid为1的用户昵称为xxx
// 默认只修改第一条数据
db.collection_name.update({"cid":"1"},{$set:{"name":"xxx"}})
// 修改所有符合条件的数据
db.collection_name.update({"cid":"2"},{$set:{"name":"xxx"}},{multi:true})
提示:如果不加后面的参数{multi:true},multi默认为false.则只更新符合条件的第一条记录
3.5 【删除】文档
删除文档的语法结构:
db.collection_name.remove(条件)
以下语句可以将数据全部删除,请慎用
db.collection_name.remove({})
3.6 【聚合查询】
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称.aggregate({管道:{表达式}})
在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理
常用管道如下:
$group: 将集合中的⽂档分组, 可⽤于统计结果
$match: 过滤数据, 只输出符合条件的⽂档
$project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
$sort: 将输⼊⽂档排序后输出
$limit: 限制聚合管道返回的⽂档数
$skip: 跳过指定数量的⽂档, 并返回余下的⽂档
$unwind: 将数组类型的字段进⾏拆分
3.87【group】
group文档:https://docs.mongodb.com/manual/reference/operator/aggregation/group/
3.8 【自定义查询】
使⽤$where后⾯写⼀个函数, 返回满⾜条件的数据
查询年龄⼤于30的学⽣
db.stu.find({
$where:function() {
return this.age>30;}
})
4.索引
索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可能要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
如果查询存在适当的索引,MongoDB可以使用该索引限制必须检查的文档数。
索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB还可以使用索引中的排序返回排序结果。
官网文档:https://docs.mongodb.com/manual/indexes/
了解:MongoDB索引使用B树数据结构(确切的说是B-Tree,MySQL是B+Tree)
索引的类型
单字段索引
MongoDB支持在集合中文档的单个字段上创建用户定义的升序降序索引,称为单字段索引(Single Fleld Index)。
对于单个字段索引和排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任何方向上
遍历索引。
复合索引
MongoDB还支持多个字段的用户定义索引,即复合索引(Compound Index)。
复合索引中列出的字段顺序具有重要意义。【例如】如果复合索引由{userid:1,score:-1}组成,则索引首先
按userid正序排序,然后在每个userid的值内,再在按score倒序排序。
其它索引
地理空间索引(Geospatial Index)、文本索引(Text Indexes)、哈希索引(Hashed Indexes)。
-
地理空间索引(Geospatial Index)
为了支持对地理空间坐标数据的有效查询,MongoDB提供了两种特殊的索引:返回结果时使用平面几何的二维索引和返回结果时使用球面几何的二维球面索引。 -
文本索引(Text Indexes)
MongoDB提供了一种文本索引类型,支持在集合中搜索字符串内容。这些文本索引不存储特定于语言的停止词
(例如"the"、"a"、"or"),而将集合中的词作为词干,只存储根词。 -
哈希索引(Hashed Indexes)
为了支持基于散列的分片,MongoDB提供了散列索引类型,它对字段值的散列进行索引。这些索引在其范围内的值分布更加随机,但只支持相等匹配,不支持基于范围的查询。
索引的管理操作
查看索引
说明:以数组的形式返回一个集合中的所有的索引。
语法:
db.collection_name.getIndexes()
提示:该语法命令运行要求是MongoDB3.0+
【示例】
查看comment集合中所有的索引情况
>db.comment.getIndexes()
[
{
"v":2,
"key":{
"_id":1
},
"name":"_id_",
"ns":"articledb.comment"
}
]
结果中显示的是默认_id索引。
创建索引
说明:在集合上创建索引。
语法:db.collection_name.createIndex(keys,options)
参数:
删除索引
说明:可以移除指定的索引,或移除所有索引
一、指定索引的移除
语法:db.collection_name.dropIndex(index)
参数:
【示例】
删除comment集合中userid字段上的升序索引:
>db.comment.dropIndex({userid:1})
{"nIndexeswas":3,"ok":1}
查看已经删除了。
二、所有索引的移除
语法:db.collection_name.dropIndexes()
【示例】
>db.collection_name.dropIndexes()
{
"nIndexeswas":2,
"msg":"non-_id indexes dropped for collection",
"ok":1
}
提示:_id的字段的索引是无法删除的,只能删除非_id字段的索引。
索引的执行计划
执行计划
分析查性能( Analyze Query Performance)通常使用执行计划(解释计划、 Explain Plan)来查看查询的情况,如查询耗费的时间、是否基于索引查询等。
那么,通常,我们想知道,建立的索引是否有效,效果如何,都需要通过执行计划查看。
语法:db.collection_name.find(query, options).explain(options)
涵盖的查询
Covered Queries
当查询条件和查询的投影仅包含素引段时, Mongodb直接从素引返回结果,而不扫描任可文档或将文档带入内存。这覆盖的查询可以非常有效。