MongoDB4.0学习笔记

作为致力于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端口查看可视化的管理工具了。

MongoDB4.0学习笔记_第1张图片

 个人感觉这个管理页面还是很好用的.

Mongo Shell Basic

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]”之类的语法就不会返回任何东西了。

关于游标函数的方法还有很多,包括游标函数的结合使用,简单说几个原则,不再详细介绍。

  1. skip要写在limit前面,因为skip永远都在limit前面执行。
  2. sort要在skip和limit之前执行。

最后关于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"
}

 

你可能感兴趣的:(SQL,and,NoSQL)