MongoDB

2023年05月02日 16:23 · 阅读(150) ·

来源

来源:尚硅谷MongoDB入门基础教程

开发环境

名称 版本
操作系统 Windows 10 X64
MongoDB 3.2.4 X64

MongoDB 文档地址

https://www.mongodb.com/docs/manual/reference/insert-methods/

MongoDB 简介

MongoDB 是为快速开发互联网 Web 应用而设计的数据库系统。
MongoDB 的设计目标是极简、灵活、作为 Web 应用栈的一部分。
MongoDB 的数据模型是面向文档的,所谓文档是一种类似于 JSON 的结构,简单理解 MongoDB 这个数据库中存的是各种各样的 JSON。(BSON)

MongoDB 下载

● 下载地址:

https://www.mongodb.org/dl/win32/
https://www.mongodb.com/download-center/community

MongoDB 的版本偶数版本为稳定版,奇数 版本为开发版。
MongoDB 对于 32 位系统支持不佳,所以 3.2 版本以后没有再对 32 位系统的支持。

这里我下载 mongodb-win32-x86_64-2008plus-ssl-3.2.4-signed.msi

MongoDB 安装

运行 mongodb-win32-x86_64-2008plus-ssl-3.2.4-signed.msi,一直下一步即可。

这里我的安装目录是 D:\Program Files\MongoDB

MongoDB 启动

● 配置环境变量,注意这里是安装目录的 bin 目录

环境变量
MongoDB D:\Program Files\MongoDB\Server\3.2\bin
Path 添加到最后 ;%MongoDB%;

● 第一种启动方式:使用默认的数据库路径端口号启动
1.创建文件夹 C:\data\db
2.打开命令行窗口,输入 mongod,此窗口不关闭

● 第二种启动方式:指定数据库路径端口号启动
1.创建文件夹 D:\Data\DB
2.打开命令行窗口,输入 mongod --dbpath D:\Data\DB --port 27017,此窗口不关闭

● 重新开启一个命令行窗口,输入 mongo,启动成功

MongoDB 设置为 Windows 服务并自启动

注意:4.x 及以上版本已经自启动,不需要设置

来源:MongoDB 设置为 Windows 服务并自启动

参考:https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/

● 创建两个目录

  1. D:\Data\DB
  2. D:\Data\Log

● 创建配置文件 D:\Program Files\MongoDB\Server\3.2\mongod.cfg

  1. systemLog:
  2. destination: file
  3. path: D:\Data\Log\mongod.log
  4. storage:
  5. dbPath: D:\Data\DB

● 根据配置文件路径修改命令

语法:

  1. sc.exe create MongoDB binPath= "\"mongo bin路径\mongod.exe\" --service --config=\"mongo路径\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"

修改后的命令为:

  1. sc.exe create MongoDB binPath= "\"D:\Program Files\MongoDB\Server\3.2\bin\mongod.exe\" --service --config=\"D:\Program Files\MongoDB\Server\3.2\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"

管理员模式启动命令行

输入

  1. sc.exe create MongoDB binPath= "\"D:\Program Files\MongoDB\Server\3.2\bin\mongod.exe\" --service --config=\"D:\Program Files\MongoDB\Server\3.2\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"

● 启动服务

● 删除服务

如果服务启动失败,或者需要重新设置服务,需要先删除服务,再重新配置

  1. sc delete MongoDB

● 关掉所有命令行窗口,重新开启一个命令行窗口,输入 mongo,启动成功

MongoDB 基本操作

来源:MongoDB 基本操作

三个概念

概念 描述
数据库(database 数据库是一个仓库,在仓库中可以存放集合。
集合(collection ● 集合类似于数组,在集合中可以存放文档。
● 集合就是一组文档,也就是集合是用来存放文档的
● 集合中存储的文档可以是各种各样的,没有格式要求
文档(document ● 文档数据库中的最小单位,我们存储和操作的内容都是文档。
● 类似于JS中的对象,在 MongoDB 中每一条数据都是一个文档

● 多个文档组成集合,多个集合组成数据库

● 基本指令

指令 作用
show dbs
show databases
显示当前的所有数据库
use 数据库名 进入到指定的数据库中
db db 表示的是当前所处的数据库
show collections 显示数据库中所有的集合

● 向数据库中插入文档

语法

  1. db.<collection>.insert(doc);

例子:向 test 数据库中的,stus 集合中插入一个新的学生对象

  1. db.stus.insert({name:"孙悟空",age:18,gender:"男"});

● 查询当前集合中的所有的文档

语法

  1. db.<collection>.find()

例子:查询 test 数据库中的 stus 集合中的文档

  1. db.stus.find();

MongoDB 安装图形化工具

来源:MongoDB 安装图形化工具

图形化工具
Navicat
mongodbmanagerfree_inst
MongoChef

这里我使用 Navicat 来进行连接。

MongoDB CURD

● 添加文档

来源:MongoDB 插入文档

  1. /* 向数据库中插入文档时,如果没有给文档指定 _id 属性,数据库会自动为文档添加 _id,该属性用来作为文档的唯一标识 */
  2. /*插入单条数据*/
  3. db.stus.insert({name:"猪八戒1",age:28,gender:"男"});
  4. /*插入单条数据,指定 _id,如果自己指定 _id,必须确保它的唯一性*/
  5. db.stus.insert({_id:"1",name:"猪八戒4",age:28,gender:"男"});
  6. /*插入多条数据*/
  7. db.stus.insert([
  8. {name:"猪八戒2",age:28,gender:"男"},
  9. {name:"猪八戒3",age:29,gender:"男"}
  10. ]);
  11. //17.向numbers中插入20000条数据 7.2s
  12. for(var i=1 ; i<=20000 ; i++){
  13. db.numbers.insert({num:i});
  14. }
  15. db.numbers.find()
  16. db.numbers.remove({});
  17. //0.4s
  18. var arr = [];
  19. for(var i=1 ; i<=20000 ; i++){
  20. arr.push({num:i});
  21. }
  22. db.numbers.insert(arr);

● 查询文档

来源:MongoDB 查询文档

  1. /*查询集合中所有符合条件的文档*/
  2. db.stus.find();
  3. db.stus.find({name:"猪八戒"});
  4. db.stus.find({name:"猪八戒",age:28});
  5. /*查询集合中所有符合条件的第一个文档*/
  6. db.stus.findOne({age:28});
  7. /*查询集合中所有符合条件的文档个数*/
  8. db.stus.find({age:28}).length();
  9. db.stus.find({age:28}).count();
  10. //18.查询numbers中num为500的文档
  11. db.numbers.find({num:500})
  12. //19.查询numbers中num大于5000的文档
  13. db.numbers.find({num:{$gt:500}});
  14. db.numbers.find({num:{$eq:500}});
  15. //20.查询numbers中num小于30的文档
  16. db.numbers.find({num:{$lt:30}});
  17. //21.查询numbers中num大于40小于50的文档
  18. db.numbers.find({num:{$gt:40 , $lt:50}});
  19. //22.查询numbers中num大于19996的文档
  20. db.numbers.find({num:{$gt:19996}});
  21. //23.查看numbers集合中的前10条数据
  22. db.numbers.find({num:{$lte:10}});
  23. //limit()设置显示数据的上限
  24. db.numbers.find().limit(10);
  25. //在开发时,我们绝对不会执行不带条件的查询
  26. db.numbers.find();
  27. //24.查看numbers集合中的第11条到20条数据
  28. /*
  29. 分页 每页显示10条
  30. 1-10 0
  31. 11-20 10
  32. 21-30 20
  33. 。。。
  34. skip((页码-1) * 每页显示的条数).limit(每页显示的条数);
  35. skip()用于跳过指定数量的数据
  36. MongoDB会自动调整skip和limit的位置
  37. */
  38. db.numbers.find().skip(10).limit(10);
  39. //25.查看numbers集合中的第21条到30条数据
  40. db.numbers.find().skip(20).limit(10);
  41. db.numbers.find().limit(10).skip(10);
  42. //27.查询工资小于2000的员工
  43. db.emp.find({sal:{$lt:2000}});
  44. //28.查询工资在1000-2000之间的员工
  45. db.emp.find({sal:{$lt:2000 , $gt:1000}});
  46. //29.查询工资小于1000或大于2500的员工
  47. db.emp.find({$or:[{sal:{$lt:1000}} , {sal:{$gt:2500}}]});
  48. //30.查询财务部的所有员工
  49. //(depno)
  50. var depno = db.dept.findOne({dname:"财务部"}).deptno;
  51. db.emp.find({depno:depno});
  52. //31.查询销售部的所有员工
  53. var depno = db.dept.findOne({dname:"销售部"}).deptno;
  54. db.emp.find({depno:depno});
  55. //32.查询所有mgr为7698的所有员工
  56. db.emp.find({mgr:7698})

● 修改文档

来源:MongoDB 修改文档

  1. /*
  2. db.collection.update(查询条件,修改对象);
  3. update() 默认情况下会使用新对象替换旧的对象。
  4. 如果需要修改指定的属性,而不是替换,需要使用“修改操作符”
  5. $set 可以用来修改文档中的指定属性
  6. $unset 可以用来删除文档的指定属性
  7. //修改多条
  8. db.collection.updateMany()
  9. //修改单条
  10. db.collection.updateOne()
  11. //替换一个文档
  12. db.collection.replaceOne()
  13. */
  14. /*替换*/
  15. db.stus.update({age:33},{name:"猪八戒",age:28,gender:"男"});
  16. /*修改指定的属性*/
  17. db.stus.update({name:"猪八戒"},{$set:{age:30}});
  18. //删除username为sunwukong的文档的address属性
  19. db.users.update({username:"sunwukong"},{$unset:{address:1}});
  20. //11.向username为sunwukong的文档中,添加一个hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}
  21. //MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做 内嵌文档
  22. db.users.update({username:"sunwukong"},{$set:{hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}}});
  23. //12.向username为tangseng的文档中,添加一个hobby:{movies:["A Chinese Odyssey","King of comedy"]}
  24. db.users.update({username:"tangseng"},{$set:{hobby:{movies:["A Chinese Odyssey","King of comedy"]}}})
  25. db.stus.find({name:"猪八戒"});
  26. //14.向tangseng中添加一个新的电影Interstellar
  27. //$push 用于向数组中添加一个新的元素
  28. //$addToSet 向数组中添加一个新元素 , 如果数组中已经存在了该元素,则不会添加
  29. db.users.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}});
  30. db.users.update({username:"tangseng"},{$addToSet:{"hobby.movies":"Interstellar"}});
  31. db.users.find();
  32. //33.为所有薪资低于1000的员工增加工资400元
  33. db.emp.updateMany({sal:{$lte:1000}} , {$inc:{sal:400}});

● 删除文档

来源:MongoDB 删除文档

  1. /* 删除符合条件的所有文档,第二个参数为 true,则只删除一个文档
  2. 如果只传递一个空对象 {},会删除所有数据
  3. */
  4. db.stus.remove({_id:"1"},true);
  5. /* 删除集合*/
  6. db.stus.drop();
  7. /* 删除符合条件的第一条文档 */
  8. db.stus.deleteOne({name:"猪八戒"});
  9. /* 删除符合条件的所有文档 */
  10. db.stus.deleteMany({name:"猪八戒"});
  11. db.stus.find();

MongoDB 排序,投影(查询指定列)

来源:MongoDB 排序,投影(查询指定列)

● 排序

  1. /*
  2. 排序
  3. sort()可以用来指定文档的排序规则
  4. 1:升序,-1:降序
  5. age:-1,按 age 降序
  6. name:1,按 name 升序
  7. */
  8. db.stus.find({}).sort({age:-1,name:1});

查询结果

  1. // 1
  2. {
  3. "_id": ObjectId("6451ba460206460b6c0008e4"),
  4. "name": "猪八戒2",
  5. "age": 29,
  6. "gender": "男"
  7. }
  8. // 2
  9. {
  10. "_id": ObjectId("6451ba460206460b6c0008e3"),
  11. "name": "猪八戒1",
  12. "age": 28,
  13. "gender": "男"
  14. }
  15. // 3
  16. {
  17. "_id": ObjectId("6450fc2e549310a96276d1ab"),
  18. "name": "孙悟空",
  19. "age": 18,
  20. "gender": "男"
  21. }

● 投影(查询指定列)

  1. /*
  2. 投影
  3. 1:显示,0:不显示
  4. */
  5. db.stus.find({},{name:1,age:1,_id:0});

查询结果

  1. // 1
  2. {
  3. "name": "孙悟空",
  4. "age": 18
  5. }
  6. // 2
  7. {
  8. "name": "猪八戒1",
  9. "age": 28
  10. }
  11. // 3
  12. {
  13. "name": "猪八戒2",
  14. "age": 29
  15. }

MongoDB 文档之间的关系

来源:MongoDB 文档之间的关系

一对一

● 一对一关系

  1. /*一对一:在 MongoDB ,可以通过内嵌文档形式体现出一对一的关系*/
  2. db.wifeAndHusband.insert([
  3. {name:"黄蓉",hasband:{name:"郭靖"}},
  4. {name:"潘金莲",hasband:{name:"武大郎"}}
  5. ]);
  6. db.wifeAndHusband.find();

● 查询结果

  1. // 1
  2. {
  3. "_id": ObjectId("6451d4e90206460b6c005705"),
  4. "name": "黄蓉",
  5. "hasband": {
  6. "name": "郭靖"
  7. }
  8. }
  9. // 2
  10. {
  11. "_id": ObjectId("6451d4e90206460b6c005706"),
  12. "name": "潘金莲",
  13. "hasband": {
  14. "name": "武大郎"
  15. }
  16. }

一对多/多对一

● 一对多关系-用户

  1. /*一对多/多对一
  2. 可以通过内嵌文档形式体现出一对多的关系
  3. */
  4. db.users.insert([
  5. {username:"孙悟空"},
  6. {username:"猪八戒"}
  7. ]);
  8. db.users.find();

查询结果:

  1. // 1
  2. {
  3. "_id": ObjectId("6451da320206460b6c005709"),
  4. "username": "孙悟空"
  5. }
  6. // 2
  7. {
  8. "_id": ObjectId("6451da320206460b6c00570a"),
  9. "username": "猪八戒"
  10. }

● 一对多关系-用户订单

  1. db.order.insert({
  2. list:["苹果","香蕉","梨"],
  3. user_id:ObjectId("6451da320206460b6c005709")
  4. });
  5. db.order.insert({
  6. list:["西瓜","牛肉"],
  7. user_id:ObjectId("6451da320206460b6c00570a")
  8. });
  9. db.order.insert({
  10. list:["西瓜","漫画"],
  11. user_id:ObjectId("6451da320206460b6c00570a")
  12. });
  13. db.order.find();

● 查找孙悟空的订单

  1. //查找孙悟空的订单
  2. var userid = db.users.findOne({username:"孙悟空"})._id;
  3. db.order.find({user_id:userid});

● 查询结果

  1. // 1
  2. {
  3. "_id": ObjectId("6451da430206460b6c00570b"),
  4. "list": [
  5. "苹果",
  6. "香蕉",
  7. "梨"
  8. ],
  9. "user_id": ObjectId("6451da320206460b6c005709")
  10. }

多对多

● 老师

  1. /*多对多*/
  2. db.teachers.insert([
  3. {name:"老师1"},
  4. {name:"老师2"},
  5. {name:"老师3"},
  6. ]);
  7. db.teachers.find();
  1. // 1
  2. {
  3. "_id": ObjectId("6451dcd20206460b6c00570e"),
  4. "name": "老师1"
  5. }
  6. // 2
  7. {
  8. "_id": ObjectId("6451dcd20206460b6c00570f"),
  9. "name": "老师2"
  10. }
  11. // 3
  12. {
  13. "_id": ObjectId("6451dcd20206460b6c005710"),
  14. "name": "老师3"
  15. }

● 学生对应的老师

  1. db.stus.insert([
  2. {name:"学生1",
  3. tech_ids:[
  4. ObjectId("6451dcd20206460b6c00570e"),
  5. ObjectId("6451dcd20206460b6c00570f")
  6. ]}
  7. ]);
  8. db.stus.find();

● 查询结果

  1. // 1
  2. {
  3. "_id": ObjectId("6451dd750206460b6c005711"),
  4. "name": "学生1",
  5. "tech_ids": [
  6. ObjectId("6451dcd20206460b6c00570e"),
  7. ObjectId("6451dcd20206460b6c00570f")
  8. ]
  9. }