作为致力于web开发的孩子,需要学习的东西着实不少,前后端的知识加上基本的网络制式,算法数据结构知识,加上一些流行的运维工具,已经压得人传不过气来了,但对于后端工程师也十分重要的数据库,我们的学习往往是不够深入的。像我学习MySQL的时候,仅仅是知道了增删改查和一点事务的知识,就觉得自己掌握了MySQL了,那么事实是什么呢?
可能这些知识确实足够你自己做点小工程时候的所有需求了,就像我在使用flask-sqlalchemy,所有的读写数据的方式仅仅使用ORM的方式就可以完成,或者使用相应的Flask扩展,其实也足够我们完成简单的业务了。
但这并不意味着我们不需要学习,MySQL毕竟写点小项目从头到尾还是认真使用过,但是mongoDB我并没有真正应用起来,于是打算系统的学习一下,无论是基础,实践,或者运维的角度,来深入了解一下mongoDB。
那么为什么选择MongoDB呢?答案有很多,其一是python和node.js对于mongoDB的支持我就不用多说了,其二,MongoDB毕竟是现在最火热的几个非关系型数据库,选择它可以说是毫不犹豫的。
之前我也介绍过MongoDB的安装,这里我使用Docker的方式安装使用MongoDB,对于我这样内存不大的超极本,能用Docker还是尽量用Docker吧。
首先创建一个volume去存放数据:
docker volume create name
为了查看volume列表,我们可以使用:
docker volume ls
接着拉取镜像
docker pull mongo:4
docker run -p 27017:27017 --name mymongo -v mongodata:/data/db -d mongo:4
顺便说一下redis和mysql,一样的语法:
docker run -p 6379:6379 --name myredis -v /myredis/data:/data -d redis redis-server --appendonly yes
docker container run --name mysql -v mysqldata:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
上述命令可以运行mongoDB的服务器,同时我们也可以使用mongo-express这个在线的可视化管理工具
docker pull mongo-express
docker run --link mymongo:mongo -p 7000:8081 mongo-express
这是我们就可以在本地的7000端口查看可视化的管理工具了。
个人感觉这个管理页面还是很好用的.
show dbs
show collections
use db1
db.col1.insertOne({})
其中,use和insertOne都可以自动创建数据库和集合。
接下来的关于增删改查的基础语法其实差不太多,大家可以直接看文档。
因为整个mongo shell类似于JavaScript的使用方法,所以我们也可以这么操作:
> let tse = db.users.find()
> tse[0]
{ "_id" : 1, "name" : "shan", "sex" : "girl" }
> tse[1]
{
"_id" : ObjectId("5d769afcaf873842a8491cc2"),
"name" : "jack",
"sex" : "boy"
}
文档说这个tse可以在全部遍历完成后被回收,或者在使用十分钟之后被回收,这种游标的功能使用起来还是很方便的。游标还有很多强大的游标函数。举个例子:
> let acd = db.users.find({sex:"girl"})
> acd.forEach(printjson)
{ "_id" : 1, "name" : "shan", "sex" : "girl" }
{
"_id" : ObjectId("5d769afcaf873842a8491cc3"),
"name" : "kara",
"sex" : "girl"
}
{
"_id" : ObjectId("5d769afcaf873842a8491cc4"),
"name" : "aleen",
"sex" : "girl"
}
这里其实使用到了JS的语法,我们把所有sex:"girl"的数据都打印了出来。当然,这样遍历就相当于结束了,这时我们再去执行“acd[0]”之类的语法就不会返回任何东西了。
关于游标函数的方法还有很多,包括游标函数的结合使用,简单说几个原则,不再详细介绍。
最后关于find()操作,我们可以为之添加条件,比如:
> db.users.find({},{name:0})
{ "_id" : 1, "sex" : "girl" }
{ "_id" : ObjectId("5d769afcaf873842a8491cc2"), "sex" : "boy" }
{ "_id" : ObjectId("5d769afcaf873842a8491cc3"), "sex" : "girl" }
{ "_id" : ObjectId("5d769afcaf873842a8491cc4"), "sex" : "girl" }
{ "_id" : ObjectId("5d769c03af873842a8491cc5"), "through" : [ "1", "2", "3" ] }
但是我们不能混用条件(除文档主键的条件之外),比如:
> db.users.find({},{name:0,sex:1})
Error: error: {
"ok" : 0,
"errmsg" : "Projection cannot have a mix of inclusion and exclusion.",
"code" : 2,
"codeName" : "BadValue"
}