Mongo DB是一个开源的、高性能、无模式的文档型NoSQL数据库,能够很好地应对数据库高并发的读写需求、海量数据的高效率存储和访问的需求以及数据库的高扩展性和高可用性的需求。同时对Web2.0的网站也能从容面对。
它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活
MongoDB中的记录是一个文档,它是一个由字段和值对组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。字段和数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。
MongoDB 非关系型数据库(Database)----->Collection(集合)----->Document(文档)
MySQL 关系型数据库(Database)----->Table(数据库表)------->Row(数据记录行)
MongoDB网址跳转
一般首先安装MongoDB Community Server 版本5.x的zip包就可以了,最新版本可能会出问题
之后安装MongoDB Compass软件用来连接MongoDB就可以了。
如果不用Mongo Compass连接MongoDB的话,在命令提示符输入相关shell命令即可完成登录。
mongo
use 数据库名称
show dbs
或者
show databases
注意:在MongoDB中,集合只有在内容插入后才会创建,也就是说创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
未添加内容时,暂存在内存里,添加内容后,则自动存到磁盘里
db
MongoDB中默认的数据库是test,如果没有选择数据库,集合将存放在test数据库中。
从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,则这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能在这个数据库运行,比如列出所有的数据库或者关闭服务器。
这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
db.dropDatabase()
集合,类似于关系型数据库中的表
name:要创建的集合名称
db.createCollection(name)
例子
创建一个名为mycollection的普通集合
db.createCollection("mycollection")
当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合
show collections
或者
show tables
db.collection.drop()
或者
db.集合.drop()
删除成功,则drop()方法返回true,否则返回false
例子
db.mycollection.drop()
文档的数据结构和JSON基本一样,所有存储在集合中的数据都是BSON格式。
使用insert( )或者save( )方法向集合中插入文档。
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
测试数据,向comment的集合中插入一条测试数据
db.comment.insert({"articleod":"10000","content":"今天天气真好","userid":"1001","createdatetime":new Date(),"state":null})
提示:
如果comment集合不存在,则会隐式创建。
mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字)。
插入当前日期使用new Date( )。
插入的数据没有指定_id,会自动生成主键值。
如果某字段没值,可以赋值为null,或不写该字段。
结果如下
使用insertMany()方法向集合中插入文档。
db.collection.insert(
[<document1> , <document1>],
{
writeConcern: <document>,
ordered: <boolean>
}
)
提示:
插入时指定了_id,则主键就是该值
如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
因为批量插入由于数据较多容易失败,因此可以使用try catch进行异常捕获处理,测试的时候可以不处理。
db.comment.insertMany([
{"_id":"1","articleId":"1001", "content":"吃饭喝水"},
{"_id":"2","articleId":"1001", "content":"吃饭喝水"},
{"_id":"3","articleId":"1001", "content":"吃饭喝水"},
])
try{
db.comment.insertMany([
{"_id":"1","articleId":"1001", "content":"吃饭喝水"},
{"_id":"2","articleId":"1001", "content":"吃饭喝水"},
{"_id":"3","articleId":"1001", "content":"吃饭喝水"},
]);
} catch(e){
print(e);
}
db.comment.find()
或
db.comment.find({})
db.comment.find()
db.comment.find({userId:'1'})
按照userId为1来查询数据
db.comment.findOne({userId:'1'})
如果要查询结果返回部分字段,则需要使用投影查询(不显示所有字段,只显示指定的字段)
显示userId、name、_id字段
db.comment.find({userId:"1"}.{userId:1, name:1, _id:1})
显示userId、name字段,不显示_id字段
db.comment.find({userId:"1"}.{userId:1, name:1, _id:0})
查询所有数据,只显示_id、userId、name
db.comment.find({}.{userId:1, name:1, _id:1})
db.collection.update(query, update, options)
query:查询选择条件
update:更新的数据
options:可选。用于修改计数的额外选项
db.comment.update({_id:"1"}.{name:NumberInt(1001)})
db.comment.update({_id:"1"}.{$set:{name:NumberInt(1001)}})
db.comment.update({userId:"100"}.{$set:{name:NumberInt(1001)}}.{multi:true})
db.comment.update({_id:"3"}.{$inc:{num:NumberInt(1)}})
db.集合名称.remove(条件)
db.comment.remove({})
db.comment.remove({_id:"1"})
db.collection.count(query, options)
query:查询选择条件
options:用于修改计数的额外选项
db.comment.count()
统计userId为100的记录条数
db.comment.count({userId:"100"})
使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据。
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
返回指定条数的记录,可以在find方法后调用limit来返回结果
如下:返回前三条的数据
db.comment.find().limit(3)
skip方法同样接受一个数字参数作为跳过的记录条数。(前N个不要)默认值是0
db.comment.find().skip(3)
// 第一页
db.comment.find().skip(0).limit(3)
// 第二页
db.comment.find().skip(3).limit(3)
// 第三页
db.comment.find().skip(6).limit(3)
.....
sort( )方法对数据进行排序,sort( )方法可以通过参数指定排序的字段,并使用1和-1来指定排序的方式,其中1为升序排列,而-1是用于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
db.集合名称.find( ).sort(排序方式)
对userId降序排列,并对number进行升序排列
db.comment.find().sort({userId:-1,number:1})
执行顺序:先sort( ),再是skip( ),最后是limit( )和命令编写顺序无关
MongoDB的模糊查询是通过正则表达式的方式实现的
db.collection.find({field:/正则表达式/})
或
db.集合.find({字段:/正则表达式/})
完全支持JS的正则写法,功能强大
查询food里包含蛋糕的所有文档
db.comment.find({food:/蛋糕/})
<,<=,>,>=相关操作符,格式如下
db.集合名称.find({"field":{$gt:value}}) //大于:field>value
db.集合名称.find({"field":{$lt:value}}) //小于:field
db.集合名称.find({"field":{$gte:value}}) //大于等于:field>=value
db.集合名称.find({"field":{$lte:value}}) //小于等于:field<=value
db.集合名称.find({"field":{$ne:value}}) //不等于:field!=value
查询数量大于700的记录
db.comment.find({number:{$gt:NumberInt(700)}})
包含使用$in操作符
查询集合中userId字段包含100或101的文档
db.comment.find({userId:{$in:["100","101"]}})
不包含使用$nin操作符
查询集合中userId字段不包含100和101的文档
db.comment.find({userId:{$nin:["100","101"]}})
查询同时满足两个以上的条件,需要使用$and操作符将条件进行关联
$and:[{ },{ },{ }]
例如:查询集合中number大于等于700并且小于2000的文档
db.comment.find({$and:[{number:{$gte:NumberInt(700)}},{number:{$lt:NumberInt(2000)}}]})
查询两个以上条件之间是或者的关系
$or:[{ },{ },{ }]
例如:查询集合中userId为10,或者点赞数小于100的文档记录
db.comment.find({$or:[{userId:"10"}, {number:{$lt:100}}]})
索引支持在MongoDB中高效地执行查询。如果存在适当的索引,MongoDB可以使用该索引限制必须检查的文档数,提高查询效率。索引是特殊的数据结构,以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB还可以使用索引中的排序返回排序结果。
MongoDB索引使用B树数据结构(B-Tree,MySQL是B+Tree)
MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引。
对于单个字段索引和排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任何方向上遍历索引。
MongoDB支持多个字段的用户定义索引,即复合索引
复合索引中列出的字段顺序具有重要意义,若复合索引由{userId:1, score:-1}组成,则索引先按userId正序排序,然后在每个userId的值内,再按score倒序排序。
返回一个集合中的所有索引的数组
db.collection.getIndexes()
查看comment集合中所有的索引概况
在集合上创建索引
db.collection.createIndex(keys,options)
keys:包含字段和值对的文档,其中字段是索引键,值描述该字段的索引类型,上升索引,值为1,降序索引,值为-1。
options:可选。包含一组控制索引创建的选项的文档
db.collection.createIndex({userId:1})
db.collection.createIndex({userId:1, name:-1})
可以移除指定的索引,或移除所有索引
语法
db.collection.dropIndex(index)
index:索引名称或索引规范
示例
db.collection.dropIndex({userId:1})
语法
db.collection.dropIndexes()
分析查询性能通常使用执行计划(解释计划、ExplainPlan)来查看查询的情况。
db.collection.find(query, options).explain(options)
当查询条件和查询的投影仅包含索引字段时,MongoDB直接从索引返回结果,而不扫描任何文档或将文档带入内存。