SpringBoot实战电商项目mall(30k+star)地址: https://github.com/macrozheng/mall
虽然说如今关系型数据库仍是主流,可是面对某些需求的时候,须要非关系型数据库来补充它,学习一个主流的NoSQL数据库仍是颇有必要的。MongoDB是一个功能丰富的NoSQL数据库,本文整理了它最经常使用的部分造成了这篇入门教程,但愿对你们有所帮助。git
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的。github
之前写的MongoDB安装教程是基于3.2版本的,发现有的朋友使用新版本安装有问题,此次咱们使用最新版本再来安装一次,本文所使用的MongoDB版本为4.2.5,总的来讲,新版本的安装更简单了。
Windows x64
版本安装,下载地址:https://www.mongodb.com/downl... mongo.exe
能够运行MongoDB自带客户端,操做MongoDB;cmd
工具,并输入以下命令。sc.exe delete MongoDB
docker pull mongo:4.2.5
docker run -p 27017:27017 --name mongo \ -v /mydata/mongo/db:/data/db \ -d mongo:4.2.5
docker run -p 27017:27017 --name mongo \ -v /mydata/mongo/db:/data/db \ -d mongo:4.2.5 --auth
docker exec -it mongo mongo
admin
集合中建立一个帐号用于链接,这里建立的是基于root
角色的超级管理员账号;use admin db.createUser({ user: 'mongoadmin', pwd: 'secret', roles: [ { role: "root", db: "admin" } ] });
db.auth("mongoadmin","secret")
MongoDB的客户端工具备不少,上面没安装的MongoDB Compass就是其中之一,另外Navicat 15版本也有MongoDB的管理功能。这里咱们使用的是一款免费的客户端工具Robo 3T(之前叫Robomongo)。
robo3t.exe
便可使用;MongoDB是非关系型数据库当中最像关系型数据库的,因此咱们经过它与关系型数据库的对比,来了解下它的概念。
SQL概念 | MongoDB概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
use
命令去建立数据库,当插入第一条数据时会建立数据库,例如建立一个test
数据库;> use test switched to db test > db.article.insert({name:"MongoDB 教程"}) WriteResult({ "nInserted" : 1 }) > show dbs admin 0.000GB config 0.000GB local 0.000GB test 0.000GB
dropDatabase()
方法来删除;> db.dropDatabase() { "dropped" : "test", "ok" : 1 } > show dbs admin 0.000GB config 0.000GB local 0.000GB
createCollection()
方法来建立集合,例如建立一个article
集合;> use test switched to db test > db.createCollection("article") { "ok" : 1 } > show collections article
drop()
方法来删除集合,例如删除一个article
集合;> db.article.drop() true > show collections
上面的数据库和集合操做是在MongoDB的客户端中进行的,下面的文档操做都是在Robomongo中进行的。
insert()
方法向集合中插入文档,语法以下;db.collection.insert(document)
insert()
方法来插入文档,例如插入一个article
文档;db.article.insert({title: 'MongoDB 教程', description: 'MongoDB 是一个 Nosql 数据库', by: 'Andy', url: 'https://www.mongodb.com/', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })
find()
方法能够获取文档,例如获取全部的article
文档;db.article.find({})
{ "_id" : ObjectId("5e9943661379a112845e4056"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "Andy", "url" : "https://www.mongodb.com/", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100.0 }
update()
来更新集合中的文档,语法以下;db.collection.update( <query>, <update>, { multi: <boolean> } ) # query:修改的查询条件,相似于SQL中的WHERE部分 # update:更新属性的操做符,相似与SQL中的SET部分 # multi:设置为true时会更新全部符合条件的文档,默认为false只更新找到的第一条
MongoDB 教程
的全部文档的title修改成MongoDB
;db.article.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
update()
方法之外,save()
方法能够用来替换已有文档,语法以下;db.collection.save(document)
5e9943661379a112845e4056
的文档的title改成MongoDB 教程
;db.article.save({ "_id" : ObjectId("5e9943661379a112845e4056"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "Andy", "url" : "https://www.mongodb.com/", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100.0 })
remove()
方法来删除集合中的文档,语法以下;db.collection.remove( <query>, { justOne: <boolean> } ) # query:删除的查询条件,相似于SQL中的WHERE部分 # justOne:设置为true只删除一条记录,默认为false删除全部记录
MongoDB 教程
的全部文档;db.article.remove({'title':'MongoDB 教程'})
find()
方法来查询文档,语法以下;db.collection.find(query, projection) # query:查询条件,相似于SQL中的WHERE部分 # projection:可选,使用投影操做符指定返回的键
article
集合中的全部文档;db.article.find()
/* 1 */ { "_id" : ObjectId("5e994dcb1379a112845e4057"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "Andy", "url" : "https://www.mongodb.com/", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 50.0 } /* 2 */ { "_id" : ObjectId("5e994df51379a112845e4058"), "title" : "Elasticsearch 教程", "description" : "Elasticsearch 是一个搜索引擎", "by" : "Ruby", "url" : "https://www.elastic.co/cn/", "tags" : [ "elasticearch", "database", "NoSQL" ], "likes" : 100.0 } /* 3 */ { "_id" : ObjectId("5e994e111379a112845e4059"), "title" : "Redis 教程", "description" : "Redis 是一个key-value数据库", "by" : "Andy", "url" : "https://redis.io/", "tags" : [ "redis", "database", "NoSQL" ], "likes" : 150.0 }
操做 | 格式 | SQL中的相似语句 |
---|---|---|
等于 | {<key>:<value>} |
where title = 'MongoDB 教程' |
小于 | {<key>:{$lt:<value>}} |
where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} |
where likes <= 50 |
大于 | {<key>:{$gt:<value>}} |
where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} |
where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} |
where likes != 50 |
MongoDB 教程
的全部文档;db.article.find({'title':'MongoDB 教程'})
db.article.find({'likes':{$gt:50}})
find()
方法传入多个键,以逗号隔开来实现,例如查询title为MongoDB 教程
而且by为Andy
的全部文档;db.article.find({'title':'MongoDB 教程','by':'Andy'})
$or
操做符实现,例如查询title为Redis 教程
或MongoDB 教程
的全部文档;db.article.find({$or:[{"title":"Redis 教程"},{"title": "MongoDB 教程"}]})
Redis 教程
或者"MongoDB 教程
的全部文档。db.article.find({"likes": {$gt:50}, $or: [{"title": "Redis 教程"},{"title": "MongoDB 教程"}]})
limit()
方法,语法以下;db.collection.find().limit(NUMBER)
db.article.find().limit(2)
skip()
方法,语法以下;db.collection.find().limit(NUMBER).skip(NUMBER)
db.article.find().limit(2).skip(1)
sort()
方法对数据进行排序,sort()
方法经过参数来指定排序的字段,并使用1和-1来指定排序方式,1为升序,-1为降序;db.collection.find().sort({KEY:1})
db.article.find().sort({likes:-1})
createIndex()
方法来建立索引,语法以下;db.collection.createIndex(keys, options) # background:建索引过程会阻塞其它数据库操做,设置为true表示后台建立,默认为false # unique:设置为true表示建立惟一索引 # name:指定索引名称,若是没有指定会自动生成
db.article.createIndex({"title":1,"description":-1}, {background: true})
db.article.getIndexes()
/* 1 */ [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.article" }, { "v" : 2, "key" : { "title" : 1.0, "description" : -1.0 }, "name" : "title_1_description_-1", "ns" : "test.article", "background" : true } ]
aggregate()
方法,相似于SQL中的group by语句,语法以下;db.collection.aggregate(AGGREGATE_OPERATION)
操做符 | 描述 |
---|---|
$sum | 计算总和 |
$avg | 计算平均值 |
$min | 计算最小值 |
$max | 计算最大值 |
db.article.aggregate([{$group : {_id : "$by", sum_count : {$sum : 1}}}])
/* 1 */ { "_id" : "Andy", "sum_count" : 2.0 } /* 2 */ { "_id" : "Ruby", "sum_count" : 1.0 }
db.article.aggregate([{$group : {_id : "$by", avg_likes : {$avg : "$likes"}}}])
/* 1 */ { "_id" : "Andy", "avg_likes" : 100.0 } /* 2 */ { "_id" : "Ruby", "avg_likes" : 100.0 }
$regex
操做符来设置匹配字符串的正则表达式,能够用来模糊查询,相似于SQL中的like操做;教程
的文档;db.article.find({title:{$regex:"教程"}})
$options
操做符;db.article.find({title:{$regex:"elasticsearch",$options:"$i"}})
具体参考:《mall整合Mongodb实现文档操做》正则表达式
mall项目全套学习教程连载中,关注公众号第一时间获取。redis