当前位置 博文首页 > 岁月平添了我的愁:MongoDB超详细保姆级入门教程!

    岁月平添了我的愁:MongoDB超详细保姆级入门教程!

    作者:[db:作者] 时间:2021-09-17 09:10

    1. 数据库简介

    SQL:结构化查询语言




    2. MongoDB简介

    BSON:二进制JSON




    3. 将MongoDB设置为系统服务

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Et9WvF22-1617710052599)(E:\学习笔记\图片\image-20201014154908638.png)]




    4. MongoDB的基本操作

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

    • 基本指令

      • show dbs:显示当前所有数据库

        show database:显示当前所有数据库

      • use 数据库名:进入到指定的数据库中(可以不存在)

      • db:表示我们当前所处的数据库

      • show collections:显示我们数据库中所有的集合

    • CRUD操作

      • 向数据库中插入文档

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

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

        db.stus.insert ( {name:“孙悟空”,age:18,gender:”男“} )

      • 查询集合中的所有文档

        db..find()




    5. 安装图形化工具

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6u01LVD3-1617710052601)(E:\学习笔记\图片\image-20201014201630172.png)]




    6. 插入文档

    db.collection.insert()

    • 向集合中插入一个或多个文档
    • 当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动给文档添加_id
      该属性用来作为文档的唯一标识
    • _id可以自己指定,如果我们指定了,数据库就不会再添加了,如果自己指定_id必须也确保唯一性
      • db.collection.insertOne():插入一个文档对象
    • db.collection.insertMany():插入多个文档对象
    db.stus.insert({name:"冉海锋",age:28,gender:"男"})
    db.stus.find()db.stus.insert([
        {name:"沙和尚",age:36,gender:"男"},
        {name:"白骨精",age:16,gender:"女"},
        {name:"蜘蛛精",age:14,gender:"女"}
    ])
    
    • $push:用于向数组中添加一个新的元素

      db.user.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}})
      
    • $addToSet:向数组中添加一个新元素(类似于向set集合中添加,如果数组中已经存在了该元素,则添加失败,因为不可重复

      db.user.update({username:"tangseng"},{$addToSet:{"hobby.movies":"Interstellar"}})
      



    7. 查询文档

    db.collection.find()

    • find()用来查询集合中所有符合条件的文档

    • find()可以接收一个对象作为条件参数

      • { }:表示所有文档
      • { 属性:值 }:查询属性是指定值的文档
      • 返回值是一个数组
    • db.collection.findOne()

      • 用来查询集合中符合条件的第一个文档

      • 返回的是一个文档

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

    db.stus.find({name:"冉海锋"})
    db.stus.findOne({name:"冉海锋"})
    db.stus.find({name:"冉海锋"})[0]
    db.stus.find({}).length()
    



    8. 修改文档

    • db.collection.update(查询条件,新对象)
      • update()默认情况下会使用新对象来替换旧对象
      • update()默认只会修改一个对象

    如果需要修改指定的属性,而不是替换,需要使用 “修改操作符” 来完成修改

    • $set:可以用来修改文档中的指定属性
    • $unset:可以用来删除文档的指定属性

    db.collection.updateMany():同时修改多个符合条件的文档

    db.collection.updateOne():修改一个符合条件的文档

    db.collection.replaceOne():替换一个符合条件的文档

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

    • MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档可以则可以通过==.的形式来匹配,且属性名必须使用引号==,双引号单引号都可以

      db.user.find("hobby.movies""hero")
    db.stus.find()
    
    db.stus.update(
        {name:"沙和尚"},{age:28}
    )
    
    db.stus.update(
        {"_id" : ObjectId("5f86edc1048d21081bd45f3b")},
        {$set:{        gender:"男",        address:"流沙河"    }}    )
    
    db.stus.update(
        {"_id" : ObjectId("5f86edc1048d21081bd45f3b")},
        {$unset:{        address:"流沙河"    }}    )
    
    db.stus.updateMany(
        {"name" :"冉海锋"},
        {$set:{    address:"高老庄"    }}    )
    
    db.stus.find()
    
    db.stus.update(
        {"name" :"冉海锋"},
        {        $set:{        address:"呵呵呵"        }    }, 
        {            multi:true        }    )
    
    db.stus.find()
    



    9. 删除文档

    • db.collection.remove()
      • 可以根据条件来删除文档,传递条件的方式和find()一样
      • 能删除符合条件的所有文档,默认删除多个
      • 如果第二个参数传递一个true,则只会删除一个
      • 如果只传递一个{ }作为参数,则会删除集合中的所有文档
    • db.collection.deleteOne()
    • db.collection.deleteMany()
    • db.collection.drop():删除集合(如果最后一个集合没了,数据库也没了。。。)
    db.stus.remove({age:28},true)
    db.stus.remove({}) //性能差
    db.stus.drop()
    db.dropDatabase()
    
    • 一般数据库中的数据都不会删除,所以删除的方法很少调用,一般会在数据中添加一个字段,来表示数据是否被删除



    10. 练习

    //添加两万条数据的性能高,尽量少调用系统的方法
    var arr=[];
    for(var i=1;i<=20000;i++){
        arr.push({num:i});
    }
    db.user.insert(arr);
    
    //查询numbers中num大于5000的文档
    db.unmbers.find({num:{$gt:500}})
    
    //查询numbers中num小于30的文档
    db.unmbers.find({num:{$lt:500}})
    
    //查询numbers中num大于40小于50的文档
    db.numbers.find({num:{$gt:40,$lt:50}})
    
    //查询numbers前10条的数据
    db.numbers.find({num:{$lte:10}})
    
    //limit()设置显示数据的上限
    db.numbers.find().limit(10)
    
    //查询numbers中第11条到20条的数据
    	//skip()用于跳过指定数量的数据   skip( (页码-1)*每页显示的条数 ).limit(每页显示的条数)
    	//MongoDB会自动调整limit()和skip()的位置
    db.numbers.find().skip(10).limit(10)
    db.numbers.find().limit(10).skip(10)
    



    11. 文档间的关系

    • 一对一(one to one)

      • 夫妻

      • 在MongoDB中,可以通过内嵌文档的形式来体现出一对一的关系

        db.WifeAndHusband.insert([
            {
                wife:"黄蓉",
                husband:{
                    name:"郭靖"
                }
            },
            
            {
                wife:"潘金莲",
                husband:{
                    name:"武大郎"
                }
            }
            
        ])
        
    • 一对多(one to many)/ 多对一(many to one)

      • 一对多:父母和孩子、用户和订单、文章和评论,也可以通过内嵌文档的方式来映射一对多的关系(将1的那个属性设置为多的里面的字段)

        db.order.insert({
        	list:["watermelor"],
            user_id:ObjectId("5f87b1deda684b252c2fc7a5")
        })
        
        var user_id = db.users.findOne({username:"swk"})._id
        //查询孙悟空的订单
        db.order.find({user_id:user_id})
        
    • 多对多(many to many):分类和商品,通过内嵌文档的方式

      db.teacher.insert([
      	{name:"洪七公"},
          {name:"黄药师"},
          {name:"龟仙人"}
      ])
      
      db.stus.insert([
          {
              name:"郭靖",
              tech_ids:[
                  ObjectId("5f87b4b6da684b252c2fc7a8"),
                  ObjectId("5f87b4b6da684b252c2fc7a9")
              ]
          },   
          {
              name:"孙悟空",
              tech_ids:[
                  ObjectId("5f87b4b6da684b252c2fc7a8"),
                  ObjectId("5f87b4b6da684b252c2fc7a9"),
                  ObjectId("5f87b4b6da684b252c2fc7aa")
              ]
          }
      ])
      



    12. 练习

    //查询工资小于1000或者大于2000的员工
    db.emp.find( $or:[ {sal:{$lt:1000}},{sal:{$gt:2500}} ])
    
    //为所有工资小于1000的增加400
    db.emp.find({sal:{$lte:1000}},	{$inc:{$sal:400}})
    



    13. sort和投影