• MongoDB数据库


    目录

    一 引入

      安装后注意事项

    二 MongoDB的基本操作

    练习

     三 文档之间的关系

     四 Mongoose

    五 Model的方法

    六 Document方法

    七 Mongoose的模块化


    一 引入

    程序都是在内存中运行的,如果程序运行结束或者计算机断电,程序运行中的数据都会丢失。
    所以我们就需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。而数据库就是数据持久化的最佳选择。

    数据库主要分成两种:
    (1)关系型数据库(RDBMS)
          ● MySQL、Oracle、 DB2、 SQL Server...
          ● 关系数据库中全都是表

      (2)非关系型数据库(NoSQL Not Only SQL)
        ●MongoDB、Redis......
        ● 键值对数据库
        ●文档数据库MongoDB

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

    下载地址:https://www.mongodb.org/dl/win32/

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

      安装后注意事项

    打开cmd命令行窗口输入

    32位注意:
    启动服务器时,需要输入如下内容

    mongod --storageEngine=mmapv1

    在命令行窗口自行设置 数据库路径与端口号:

    mongod --dbpath 数据库路径  --port 端口号

     要操作数据库必须先启动服务器(mongod用来启动服务器),MongoDb 4. 0版本以上在安装的时候已经设置自动启动了。

    客户端用来操作服务器,对数据进行增删改查的操作(mongo用来启动客户端)

    我们下载的MongoDb是数据库服务器,可以包含多个数据库(database),一个数据库可以存放多个集合(collection),集合里可以有多个文档(document),文档是数据库中的最小单位,我们存储和操作的内容都是文档。

    二 MongoDB的基本操作

    在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合

    基本指令:
       show dbs
       show databases
             -显示当前的所有数据库
    use 数据库名
           -进入到指定的数据库中.
    db
          - db表示的是当前所处的数据库
    show collections
          -显示数据库中所有的集合
    数据库的CRUD (增删改查)的操作

     以下的colection表示集合名:

    (1)向集合中插入文档:db.集合名.insert (doc)

      db. collection. insertOne():插入一个文档对象
      db. collection. insertMany ():插入多个文档对象(参数为数组)

    1. //插入一个
    2. db.stus.insert({name:"八戒",age:28, gender:"男"});
    3. //插入多个
    4. db.stus.insert([
    5. {name: "张三",age:38,gender:"男"},
    6. {name:"亚梦" ,age:16,gender:"女"} ,
    7. {name: "米业",age:14,gender:"女"}
    8. ]) ;
    9. /*当我们向集合中插入文档时,如果没有给丈档指定_ id美性, 则数据库会自动为文档添加_ id,该属性用来作为文档的唯一标识
    10. _id我们可以自己指定,如果我们指定了数据库就不会再添加了,如果自己指定_ id 也必须保证它的唯一性
    11. */
    12. // 生成_id
    13. ObjectId()

    (2)查询当前集合中的所有的文档:db.collection.find ()
           find()用来查询集合中所有符合条件的文档,返回的是一个数组
           find()可以(非必须)接收一个对象作为条件参数:{属性:值},查询属性是指定值的文档,可指定多个,之间用逗号连接,参数为{ }表示查询集合中所有的文档。

      db. collection. findOne ():用来查询集合中符合条件的第一个文档
          findOne ()返目的是一个文档对象

     db.collection. find({ }) .count ()查询所有结果的数量

    (3)修改:db. collection. update (查询条件,新对象)

               update ()默认情况下会使用新对象来替换旧的对象

    db. stus .update ({name: "沙和尚"}, {age:28}) ;
    

      如果需要修改指定的属性,而不是替换需要使用"修改操作符"来完成修改:
                              1)  $set 可以用来修改文档中的指定属性 

    1. db.stus.update(
    2. {"name" : 亚梦},
    3. {$set: {
    4. gender:20
    5. }},
    6. // update()默认只改一个
    7. //添加下面的就可以修改多个符合条件的
    8. {
    9. multi:true
    10. )
    11. )

                                  2)$unset可以用来删除文档的指定属性

    1. //要删除的属性,它的值任意
    2. db.stus.update(
    3. {"name" : 亚梦},
    4. {$unset:{
    5. age:1
    6. }}
    7. )

    db. collection.updateMany ()--->同时修改多个符合条件的文档
    db. collection.updateOne ()--->修改一个符合条件的文档
    db. collection.replaceOne ()---->替换一个文档

    (4)删除

    db. collection. remove ()---->删除符合条件的所有的文档(默认情况下会删除多个)

           remove ()可以根据条件来删除文档,传递的条件的方式和find()-样
          如果remove ()第二个参数传递一个true,则只会删除一个
          如果只传递一个空对象作为参数,则会删除集合中的所有文档
    db. collection. deleteOne ()--->删除一个
    db. collection. deleteMany ()--->删除多个
    db.collection.drop() 删除集合
    db. dropDatabase () 删除数据库

    -般数据库中的数据都不会删除,所以删除的方法很少调用
    一般会在数据中添加一个字段(isDel),来表示数据是否被删除

    1. db.jihe.insert([
    2. {
    3. name:"zs",
    4. isDel:0
    5. },
    6. {
    7. name:"lisi",
    8. isDel:0
    9. },
    10. {
    11. name:"wangwu",
    12. isDel:0
    13. }
    14. ]);
    15. db.jihe.updateOne({name:"lisi"},{$set:{isDel:1}});
    16. db.jihe.find({isDel:0})

    练习

    MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做 内嵌文档

    1. /*1 向username为bj的文档中添加一个
    2. hobby:{cities : [ "beijing", "shanghai", "shenzhen"],movies:["sanguo", "hero"] }
    3. */
    4. db.users.update(
    5. {username:"bj"},
    6. {$set:{hobby:{cities:[ "beijing", "shanghai", "shenzhen"],movies:["sanguo", "hero"] }
    7. }
    8. });
    9. //2查询喜欢电影hero的文档
    10. /*MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
    11. 如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号*/
    12. db.users.find({'hobby.movies':"hero"});
    13. //3向username为bj中添加一个新的电影Interstellar
    14. //$push用于向敷组中添加一个新的元素
    15. //$addToSet向数组中添加一个新元素 ,如果数组中已经存在了该元素,则不会添加
    16. db.users.update ({username:"bj"}, {$push:{"hobby.movies":"Interstellar"}}) ;
    17. //db.users.update ({username:"bj"}, {$addToSet: {"hobby.movies":"Interstellar"}})
    18. //4.删除喜欢beijing的用户
    19. db.users.remove({"hobby.cities":"beijing"});
    1. //向numbers中添入20000条数据
    2. var arr=[];
    3. for(var i=1;i<=20000;i++){
    4. arr.push({num:i});
    5. }
    6. db.numbers.insert(arr);
    7. //查询numbers中num大于5000的文档
    8. db.numbers.find({num:{$gt:500}}) ;
    9. //查询numbers中num等于5000的文档
    10. db.numbers.find({num:{$eq:500}}) ;
    11. //查询numbers中num小于30的文档
    12. db.numbers.find({num:{$lt:30}}) ;
    13. //查询numbers中num大于40小于50的文档
    14. db.numbers.find({num:{$gt:40,$lt:50}}) ;
    15. //查询numbers中num小于20或大于50的文档
    16. db.numbers.find({
    17. $or:[{num:{$lt:20}},{sal:{$gt:50}}]
    18. })
    19. //为所有num小于20的增加30(如果是减30则把30改为-30)
    20. db.numbers.updateMany({num:{$lt:20}},{$inc:{num:30}});
    21. // limit()设置显示数据的展示
    22. db.numbers.find().limit (10) ;
    23. //查询11到20条数据
    24. //skip()用于跳过指定数量的数据,skip((页码-1) *每页显示的条数).limit(每页显示的条数);
    25. //MongoDB会自动调整skip和limit的位置
    26. db.numbers.find().skip(10).limit(10)

     三 文档之间的关系

    (1)一对一

    1. db. wi feAndHusband. insert ([
    2. {
    3. name:"黄蓉" ,
    4. husband: {
    5. name:"郭靖"
    6. }
    7. },
    8. {
    9. name:"潘金莲",
    10. husband: {
    11. name: "武大郎"
    12. }
    13. }
    14. ])

    (2)一对多

    1. db.users.insert ([{
    2. username:"swk"
    3. }, {
    4. username:"zbj"
    5. }]) ;
    6. db.order.insert([
    7. {
    8. list:["苹果","香蕉"],
    9. //swk的id
    10. user_id:ObjectId("62f63f1ba51086bb19a54cf0")
    11. },
    12. {
    13. list:["牛肉"],
    14. //bj的id
    15. user_id:ObjectId("62f63f1ba51086bb19a54cf1")
    16. }])
    17. //查找swk的订单
    18. var user_id=db.users.findOne({username:"swk"})._id;
    19. db.order.find({user_id:user_id});

    (3)多对多

    1. db.teachers.insert([
    2. {name:"老师一"},
    3. {name:"老师二"},
    4. {name:"老师三"}
    5. ]);
    6. db.stus.insert([
    7. {
    8. name:"学生一",
    9. tech_ids:[ObjectId("62f62cf6a51086bb19a54ced"),ObjectId("62f62cf6a51086bb19a54cee")]
    10. }
    11. },{
    12. name:"学生二",
    13. //老师一、二、三的_id
    14. tech_ids:[ObjectId("62f62cf6a51086bb19a54ced"),ObjectId("62f62cf6a51086bb19a54cee"),
    15. ObjectId("62f62cf6a51086bb19a54cef")]
    16. }
    17. ]);

       补充:查询文档时,默认情况是按照_id的值进行排列(升序)
                 sort ()可以用来指定文档的排序的规则,sort ()用要传递一个对象来指定排序规则,参数为{属性:1}表示升序,{属性:-1} 表示降序

    1. //先按照sal升序排列,再对sal相同的按照empno降序排列
    2. db.emp.find({}).sort({sal:1, empno:-1}) ;

      limit skip sort可以以任意的顺序进行调用

     四 Mongoose

    mongoose的好处:
         ●可以为文档创建一个模式结构( Schema )
         ●可以对模型中的对象/文档进行验证
         ●数据可以通过类型转换转换为对象模型
         ●可以使用中间件来应用业务逻辑挂钩
         ●比Node原生的MongoDB驱动更容易

    mongoose中为我们提供了几个新的对象
    一Schema(模式对象)
        Schema对象定义约束了数据库中的文档结构
    一Model
         Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
    一Document
         Document表示集合中的具体文档,相当于集合中的一个具体的文档
     

    连接数据库基本步骤:

    1.下载安装Mongoose

    npm  i mongoose --save

    2.在项目中引入mongoose 
    const mongoose = require ( "mongoose") ;
    3.连接MongoDB数据库
    mongoose.connect ( 'mongodb://数据库的ip地址:端口号/数据库名')
     如果端口号是默认端口号(27017) 则可以省略不写

    4 断开MongoDB数据库(一般不需要调用)
        MongoDB数据库,一般情况下, 只需要连接-次,连接-次以后,除非项目停止服务器关闭,否则连接-般不会断开
       mongoose. disconnect ()


    监听MongoDB数据库的连接状态:
        在mongoose对象中, 有一个属性叫做connection,该对象表示的就是数据库连接
        通过监视该对象的状态,可以来监听数据库的连接与断开
        数据库连接成功的事件
       mongoose. connection. once ("open", function() {}) ;

        数据库断开的事件
        mongoose. connction. once ("close", function() {}) ;

    1. const mongoose=require("mongoose");
    2. const { Schema } = mongoose;
    3. mongoose.connect("mongodb://localhost:27017/mymongose");
    4. mongoose.connection.once("open",function(){
    5. console.log("数据库连接成功")
    6. })
    7. mongoose.connection.once("close", function() {
    8. console. log ("数据库连接已经断开~~~");
    9. }) ;
    10. //创建schema (模式)对象
    11. const stuschema = new Schema({
    12. name: String,
    13. age : Number,
    14. gender: {
    15. type:String,
    16. //默认值
    17. default: "female"
    18. },
    19. address: String
    20. }) ;
    21. //通过schema,来创建Model
    22. //Model代表的是数据库中的集合,通过Model才能对数据库进行操作
    23. //mongoose.model (modelName, schema) :
    24. //modelName 就是要映射的集合名 mongoose会自动将集合名变成复数
    25. const StuModel = mongoose.model("student",stuschema);
    26. //向数据库中插入一个文档
    27. //StuMode1. create (doc, function(err) {}) ;
    28. StuModel.create({
    29. name: "小明",
    30. age: 19,
    31. gender: "male",
    32. },function(err){
    33. if(!err){
    34. console.log("插入成功");
    35. }
    36. })

    五 Model的方法

    (1)Model. create (doc(s),[callback])
      -用来创建一个或多个文档并添加到数据库中
      -参数:
        doc(s) 可以是一个文档对象,也可以是一个文档对象的数组
        callback当操作完成以后调用的回调函数

    (2)Model. find (conditions, [projection], [options], [callback])
               -查询所有符合条件的文档,总会返回一个数组
           Model. findById(id, [projection], [options], [callback])
               -根据文档的id属性(不用带ObjectId)查询文档,总会返回一个文档对象
           Model. findOne ([conditions],[projection], [options], [callback].
               -查询符合条件的第一个文档,总会返回一个文档对象

    conditions查询的条件
    projection投影 需要获取到的字段

                   两种方式:

                                  {name:1,_id:0}

                                  "nmae  -_id"

    1. /查询结果只有名字
    2. //第一种方式
    3. /*StuModel.find({},{name:1,_id:0},function(err,docs){
    4. if(!err){
    5. console.log(docs);
    6. }
    7. })*/
    8. //第二种方式
    9. StuModel. find({}, "name -_id", function (err,docs) {
    10. if(!err) {
    11. console.log (docs) ;
    12. }
    13. }) ;

    options查询选项 (skip limit)
    callback回调函数,查询结果会通过回调函数返回
    回调函数必须传,如果不传回调函数,压根不会查询

    通过find()查询的结果,返回的对象,就是Document, 文档对象
    Document对象是Model的实例,通过Model查询到结果都是Document

    1. StuModel.findById("62f716d63bf6858aee2dc8ae", function (err,doc) {
    2. if(!err) {
    3. console.log (doc instanceof StuModel) ;//true
    4. }
    5. }) ;

    (3)Model. update (conditions, doc, [options], [calIback])
             Model. updateMany (conditions, doc, [options], [callback])
             Model. updateOne (conditions, doc, [options], [cal Iback])
                           一用来修改一个或多个文档
                             一参數:
                                           conditions  查询条件
                                           doc  修改后的对象
                                           options    配置参数
                                           callback   回调函数

    1. StuModel.updateOne({name:"小明"},{$set:{age:20}},function(err){
    2. if(!err){
    3. console.log("修改成功")
    4. }
    5. })

    (4)Model . remove (conditions,[calIback] )
        Model. deleteone (conditions, [callback])
        Model. deleteMany (conditions,[callback] )

                              ---删除

    (5)Model. count (conditions, [callback])
                    统计文档的数量

    六 Document方法

    1. const mongoose=require("mongoose");
    2. const { Schema } = mongoose;
    3. mongoose.connect("mongodb://localhost:27017/mymongose");
    4. mongoose.connection.once("open",function(){
    5. console.log("数据库连接成功")
    6. })
    7. mongoose.connection.once("close", function() {
    8. console. log ("数据库连接已经断开~~~");
    9. }) ;
    10. //创建schema (模式)对象
    11. const stuschema = new Schema({
    12. name: String,
    13. age : Number,
    14. gender: {
    15. type:String,
    16. //默认值
    17. default: "female"
    18. },
    19. address: String
    20. }) ;
    21. const StuModel = mongoose.model("student",stuschema);
    22. //创建一个Document
    23. const stu=new StuModel({
    24. nmae:"heidou",
    25. age:15,
    26. gender:"male",
    27. address:"西南"
    28. })
    29. 1/*
    30. document的方法(吞服哦文档对象调用)
    31. Model #save ([options],[fn])
    32. */
    33. stu. save (function (err) {
    34. if(!err) {
    35. console. log ("保存成功~")
    36. }
    37. }) ;
    38. StuModel.findOne({},function(err,doc){
    39. /*
    40. update(update, [options], [callback])
    41. -修改对象
    42. remove ([callback])
    43. 一删除对象
    44. * */
    45. //修改的方式一
    46. /* doc.update({$set:{age:28}},function(err){
    47. if(!err){
    48. console.log("修改成功")
    49. }
    50. })*/
    51. //修改的方式二
    52. doc.age=18;
    53. doc.save();
    54. //删除
    55. /* doc.remove(function(err){
    56. if(!err){
    57. console.log("删除成功")
    58. }
    59. })*/
    60. /*
    61. get(name)
    62. ---获取文档中的指定属性值
    63. //console.1og (doc.get ("age"));
    64. //console. 1og (doc.age)
    65. set(name,value)
    66. ---设置文档的指定的属性值
    67. //doc. set ("name", "猪小小”) ;
    68. id
    69. -----获取文档的_id属性值
    70. //console.log(doc.id);
    71. //console.log(doc._id);
    72. */
    73. /*toObject()
    74. -将Document对象转换为 一个普通的JS对象,
    75. 转换为普通的js对象以后,注意所有的Document对象的方法或属性都不能使用1
    76. */
    77. doc=doc.toObject();
    78. delete doc.age;
    79. console.log(doc._id)
    80. })

    七 Mongoose的模块化

     

     

     

  • 相关阅读:
    V神讲述veTokens的恩怨情仇:原理、权力与未来趋势
    深度学习入门(四十二)计算机视觉——目标检测和边界框
    什么是GPT与MBR
    利用OpenCV实现图片中导线的识别
    记:谷歌开发者大会2022——共码未来
    Shell常用脚本:Nexus批量上传本地仓库增强版脚本(强烈推荐)
    PHPadmin写shell的方法
    MyCat-web安装文档:安装Zookeeper、安装Mycat-web
    POM文件详解
    Ubuntu性能分析-ftrace 底层驱动
  • 原文地址:https://blog.csdn.net/qq_62401904/article/details/126283194