4.MongoDB 基础

本文由清尘发表于2019-03-18 20:23最后修改于2019-04-02属于javascript分类

相关文章:

1.Node.js 起步
2.Node.js测试 Mocha框架
3.Express基础
4.MongoDB 基础
5.Node.js 与 MongoDB
6.Node.js:REST 接口
7. Socket.io
8. JWT:JSON Web Token
9. Node.js:基于 Token 的身份验证
10. Node.js:上传文件
===========================

创建一个 mongo 容器

可以在任何想要使用 MongoDB 的地方安装一下它,这里我用 Docker 的 mongo 镜像,去创建一个 MongoDB 的容器 , 然后登录上去,在上面再去试一下 MongoDB 这个数据库

先用 docker 去创建一个在后台运行的容器,名字是 mongo 用的镜像也是 mongo 如果主机上没有这个容器,docker 会自动给我们去下载它

docker run -d --name mongo mongo

成功以后,再进入到这个容器里面

docker exec -it mongo bash

与数据库交互的界面:mongo shell

在 mongo shell 里面,我们可以使用 JavaScript 去操作 MongoDB … 在这里你可以去处理 MongoDB 里的数据,它会立即给你返回执行的结果,所以它也是一个学习 MongoDB 的很好的地方 .. 安装了 MongoDB 以后你可以得到这个工具 ..

确定 MongoDB 已经启动了 .. 然后输入 mongo .. 这样就可以进入到这个 mongo shell .. 输入 help .. 它会返回一些帮助信息 ..

mongo
help
db

默认 mongo shell 会连接到一个叫 test 的数据库 .. 执行一下 db .. 可以返回当前正在使用的数据库 .. 要使用其它的数据库,直接执行一下 use .. 后面加上数据库的名字 .. 比如 shine-mongo .. 再看一下当前的数据库 ..

use shine-mongo
db

这个数据库如果不存在会自动给我们创建一个 .. 这样在这里执行的操作只会对这个数据库起作用 ..
要退出可以执行一下 exit .. 或者直接按一下 ctrl + c ..

插入文档:insert

MongoDB 数据库里面就是一些 collection 组成的,每个 collection 里面有一些文档

一次插入一个文档

db.albums.insertOne({title:"再见理想"})

查看文档

db.albums.find()

一次插入多条文档

db.albums.insertMany([{title:"旧日足迹"},{title:"Parachutes"}])
db.albums.find()

插入一个文档或者多个文档

db.albums.insert([{title:"光辉岁月"},{title:"继续革命"}])
db.albums.find()

修改文档:update

集合的更新文档的方法,一般他们的第一个参数都是一个过滤器 .. 在这里你可以设置一些条件,这样更新的方法只会去更新满足条件的文档 .. 这里我要更新所有的文档 .. 可以先用一个空白的对象

第二个参考是要更新的东西 .. 也是一个对象 .. 然后是一个操作符 .. 不同的操作符有不同的作用 .. 要去设置一些东西,可以使用一个 $set .. 它的值就是要更新的内容 .. 这里我们用一个 artist 字段 .. 把它的值设置成 Beyond ..

如果文档里面没有 artist 这个字段,会自动给我们添加一个 .. 如果有的话,会把它的这个字段的值设置成 Beyond ..

updateMany 这个方法,它可以一次更新所有满足过滤条件的文档 .

db.albums.updateMany(
  {},
  {
    $set:{ artist: "Beyond"}
  }
)

更新一个文档

updateOne 这个方法只会更新一个文档 如果过滤的结果有多个文档,它也只会去更新一个
设置一下它的过滤参数 ,这里我们用一下 title 这个字段, 它的值是 Parachutes , 意思就是,找到 title 字段的值是 Parachutes 的所有的文档

使用 $set 这个操作符 , 把 artist 这个字段的值 , 设置成 Coldplay

db.albums.updateOne(
  {title:"Parachutes"},
  {
    $set:{ artist: "Coldplay"}
  }
)

删除文档:remove

从集合里删除文档,可以使用 deleteOne ,它可以删除掉找到的一个文档, deleteMany 可以删除掉找到的所有的文档 .. 还有一个 remove 方法也可以去删除文档 ..

db.albums.deleteOne({artist:"Beyond"})

再用一下 remove 这个方法 .. 它的第一个参数也是一个过滤器 .. 直接执行它的话 ,它会删除掉所有符合过滤条件的文档 .. 如果你只想删除一个,可以把它的第二个参数设置成 true ..

db.albums.remove({artist:"Beyond"},true)

删除多个文档

删除多个文档也可以使用 deleteMany 这个方法 .. 使用一下这个方法 .. 删除掉 artist 的值是 Beyond 的文档 ..

db.albums.deleteMany({artist:"Beyond"})

删除所有的文档

要删除所有的文档,可以使用 remove 这个方法 .. 给它一个空白的对象作为过滤参数

db.albums.remove({})

查询文档

Mongo 的集合里面提供了一些方法,方便我们找到想要的文档 .. 我们可以先去准备一些数据 .. 这里可以使用豆瓣 API 提供的电影数据 .. 用 postman 请求一下豆瓣 API 的 top250 这个接口 .. https://api.douban.com/v2/movie/top250

返回的就是在豆瓣上排名前 250 位的电影 .. 默认这里会给我们显示 20 个结果 .. 这里我需要的是 subjects 属性的数据 .. 复制一下 ..

在编辑器里组织一下 .. 使用 db.movies.insertMany 这个方法 .. 我们把刚才的这些电影数据放到 movies 这个集合里面 ..

粘贴过来 .. 再去执行一下 … 再查看一下 movies 集合里的数据

db.movies.insertMany(
  //subjects里的内容复制到这里,subjects里面的一个数组
)

db.movies.find()

查询文档并限制返回的字段

集合里的 find 这个方法可以帮我们找出集合里的文档 .. 如果不使用参数的话,他会给我们返回集合里的所有的文档 .. 这里我们给它添加一个过滤的参数 .. 是一个对象 .. 设置一下,比如我们找到文档里 year 这个字段的值是 1994 的电影 ..

db.movies.find({year:"1994"})

它会给我们返回一些内容,因为文档里的内容比较多,这里我可以限制一下这个查询出来的结果里面包含的字段 .. 把它们放到 find 方法的第二个参数上 .. 也是一个对象 .. 比如我想在结果里包含 title 这个字段 .. 把它列出来 .. 然后把它的值设置成 1 .. 表示我们要包含这个字段 .. 逗号分隔一下 .. 再添加一个 year 这个字段 ..

db.movies.find({ year: "1994"},{ title: 1, year: 1})

去掉id字段

db.movies.find({ year: "1994"},{ title: 1, year: 1,_id:0})

指针方法:跳过, 限制, 排序

使用一些 Cursor 方法,也就是指针的方法 … 可以影响返回的查询结果。 现在这个查询显示的就是所有在 movies 集合里的文档,限制了一下返回的字段 ..

db.movies.find({},{title:1,year:1,"rating.average":1,_id:0})

在这个查询的后面,用一个 size() 方法可以得到查询的结果的数量 .. 这里显示有二十个结果 ..

db.movies.find({},{title:1,year:1,"rating.average":1,_id:0}).size()

skip 方法,它可以跳过一些结果,比如我要省略掉前 10 个结果 .. 现在这里显示的就是查询结果的 10 个以后的结果 ..

db.movies.find({},{title:1,year:1,"rating.average":1,_id:0}).skip(10)

limit方法,可以限制查询返回的数量,比如只显示3条

db.movies.find({},{title:1,year:1,"rating.average":1,_id:0}).limit(3)

也可以链接到一起 比如在这个 limit 的后面,再用一个 skip .. 跳过三个结果 ..

db.movies.find({},{title:1,year:1,"rating.average":1,_id:0}).limit(3).skip(3)

评分升序排列

用 sort 去排下顺序 .. 把排序的依据交给这个方法 .. 这里设置成 rating.average .. 它表示的是电影的评分 .. 把它的值设置成 1 .. 意思就是按照评分升序排列 ..

db.movies.find({},{title:1,year:1,"rating.average":1,_id:0}).sort({"rating.average":1})

降序排列

db.movies.find({},{title:1,year:1,"rating.average":1,_id:0}).sort({"rating.average":-1})

查询操作符

使用查询操作符,我们可以设置更复杂的查询操作 … 比如找出字段大于某个值,或者得小于某个值的文档,可以使用地理类型的操作符,找出在附近多远的东西 … 用逻辑操作符来指定与或非的条件 … 我们也可以使用正则表达式来设置匹配特定模式的文档 …

比如我要找出评分大于 9.5 分的电影

db.movies.find({"rating.average":{$gt:9.5}},{title:1,"rating.average":1,_id:0})

评分小于9.5的电影

db.movies.find({"rating.average":{$lt:9.5}},{title:1,"rating.average":1,_id:0})

查询操作符:包含与不包含 – $in 与 $nin

使用 $in 还有 $nin 这两个操作符,可以查询出字段里面包含还有不包含指定的值的文档

找出类型里面包含犯罪的所有的文档

db.movies.find({genres:{ $in:["犯罪"]}},{title:1,genres:1,_id:0})

找出类型里面包含犯罪或者剧情的所有的文档

db.movies.find({genres:{ $in:["犯罪","剧情"]}},{title:1,genres:1,_id:0})

换成不包含

db.movies.find({genres:{ $nin:["犯罪","剧情"]}},{title:1,genres:1,_id:0})