• MongoDB学习笔记一:MongoDB基础


    MongoDB是什么?

    MongoDB是一个基于分布式文件存储的数据库。是面向文档的。

    MongoDB存储数据的格式很像json,称之为Bson

    MongoDB是介于关系型数据库和非关系型数据库之间的一个产品

    学了有什么用?

    我举个例子,比如开启一个新的项目。你使用关系型数据库,那么你设计表结构可能就要设计一个星期之久,而且,你设计的表结构也不一定是最好的。

    想想看,一个星期的时间都用去设计表结构了,而我们的MongoDB可以直接开始,不需要设计什么表结构,直接key,value的去存取就可以了

    所以MongoDB的特点就是快

    MongoDB入门

    安装



    到这一步不要勾选左下角的,默认是勾选的,你记得取消,这个是下载一个MongoDB的管理查看工具,下载可能下载到地久天荒.....

    安装完之后,有bin文件夹了啊,喜极而泣啊

    把你的bin路径复制,配置到环境变量里面,如图

    打开cmd,输入mongod测试一下,出来内容就表明,成功的启动了MongoDB服务器

    再输入mongo,输入1+1,回车,输入var a=10;回车,发现都是可以计算的

    修改数据库位置

    默认的MongoDB的数据库存放位置是C:data,但是我不想把数据库放在C盘,这时候就要指定一个位置作为MongoDB存放数据库的地方,方法有两种

    1. 命令方式

    首先创建数据库目录,例如d:data。然后运行命令

    mongod –dbpath d:data
    

    这里讲一下,在修改数据库位置的时候还可以指定端口号,现在默认的端口号是27017,可以指定,如下,但是还是不建议修改端口号,知道就行了

    mongod –dbpath d:data --port 10069
    
    1. 配置文件方式

    在任意位置创建一个配置文件,例如c:mongodbconf的目录下创建一个名为master.cfg的文件,内容为dbpath=d:data。然后运行命令

    mongod –config c:mongodbconfmaster.cfg
    

    MongoDB的启动方式

    其实在MongoDB4.0开始,什么data,log,还有配置的cfg文件都有的,不需要自己去设置了,MongoDB的启动方式有两种

    1. 命令行启动,这种方式每次开机都得启动一次,而且还不能关
    2. 服务启动,这种方式每次开机会自动启动

    建议使用服务的方式。这里不介绍了,MongoDB4.0帮你做了很多的事情

    MongoDB的图形化工具

    网上说Idea有一个MongoDB的插件,但是我不会用,网上都是介绍怎么安装,没讲怎么使用。所以我使用了另外一款图形化工具mongodbmanager

    记得下载免费版本

    MongoDB基本命令

    其实去菜鸟教程看看都有,我还是记录一下吧

    查看所有的数据库

    show dbs;
    

    创建或使用数据库,这个比较好的一点是,如果有test数据库就直接使用了,如果没有test数据库,就会自动创建然后使用,Nice

    use test;
    

    展示集合

    show collections;
    

    向集合内插入一个文档对象,集合也是自动创建的,顺便提一下,插入文档对象的时候,默认会加一个_id的列,这个主要是唯一的标识符,你可以自己指定,但是没必要

     db.status.insert({name:"Vae",age:18,sex:"male"});
    

    查询

    查询集合内所有的文档,两种方式都可以

     db.status.find();
     db.status.find({});
    

    查询文档的时候加上筛选条件

    // 查询name为Vae的数据 
    db.status.find({name:"Vae"});
    // 查询name为Vae且年龄为18的数据 
    db.status.find({name:"Vae",age:18});
    // 查询name为Vae的第一条数据,可能很多人叫Vae 
    db.status.findOne({name:"Vae"});
    db.status.find({name:"Vae"})[0];
    // 查询集合下文档的数量
    db.status.find().count();
    // 查询name为Vae的数据 
    db.status.find({name:"Vae"});
    

    更新

    加一个新列

    添加了一个新列status,值为0,条件是{},也就是所有的数据都会加一个新列.

    {multi:true}的意思是多行,有了这个才会所有的数据都加一个数据为0的列

    db.Address.update({},
    {$set:{   
        status:"0"}
     },{multi:true}
    )
    
    注意:update方法默认是替换,update方法一定要学会再使用,慎用

    替换文档,你以为会把Vae的年龄改为32吗?不是的,update默认是替换,你一执行,Vae这个文档数据全部没有,只有一个{age:32}了,全部被替换了

    db.status.update({name:"Vae"},{age:32})
    

    update默认是替换,那到底怎么更新呢?答案如下,使用$set就可以更新了,一般我们更新的依据的关键字,大多是Id

    db.status.update(
     {"_id":ObjectId("5cd26dcfd895bfbdc1cb7a5e")},
     
     {$set:{   
        name:"许嵩",  
        sex:"男" }
     }
     
     )
    

    $set已有的字段就是更新,如果是没有的字段也使用了$set,那就会再加上一列

    如果你更新的依据是name,那么在name重复多条数据的时候,update使用$set添加新列的时候,默认添加第一条。但是也可以更新多条,如下

    db.status.update(
       {"name":"Vae"},
        {$set:{   
        tags:"Music"}
       },
       
       {
         upsert: <boolean>,
         multi: true, //true就是更新多条,false就是更新一条
         writeConcern: <document>
       }
    )
    

    $set是更新没错,我现在有一个新的需求,我想让工资加400,怎么办?使用$set的话我得先知道原来的值,自己去加4再赋值。100条数据怎么办?

    新的命令$inc

    db.status.updateMany({sal:{$lte:1000}},{$inc:{sal:400}})
    

    这个是自增的,在原来工资的基础上自己加400.

    删除

    注意:一般不删除数据,所以这个看看就可以了,可以新加一个字段是否删除,1和0,0是删除,1是显示

    删除所有的数据,删数据跑路,效率有点低,因为先匹配,后删除

    db.status.remove({});
    

    删集合跑路,如果一个集合里面的所有数据都不想要了,与其使用上面的remove,还不如使用drop

    db.status.drop();
    

    删除name为许嵩的数据,justOne为true就删除一条,否则就全部删除

    db.collection.remove(
       {"name":"许嵩"},
       {
         justOne: true,
         writeConcern: <document>
       }
    )
    

    删除数据库

    db.dropDatabase()
    

    排序

    1是升序,-1就是降序

    db.status.find({}).sort({age:1})
    

    两个排序依据的字段这样写,先前面的后后面的

    db.status.find({}).sort({sal:1,age:1})
    

    投影

    所谓的投影,就是想看哪些列,不想看哪些列,例如我只想看name和age两个列,其他的都不想看

    db.status.find({},{name:1,age:1,_id:0})
    

    MongoDB练习题

    学了上面的简单的增删改查,下面来做一些简单的练习题

    插入2万条数据

    我第一次的写法是这样的,我特意截图看看消耗的时间吧,整整12.6秒

    for(var i=0;i<20000;i++){
         db.student.insert({name:"许嵩",num:i});
    }
    

    这当然是不可取的,区区2万条数据就消耗我12.6秒的时间?分析一下,上面的写法明显是执行insert方法执行了2万遍。所以,是这里消耗时间了。删除所有的数据。修改一下代码

    var arr =[];
    for(var i=0;i<20000;i++){
        arr.push({name:"许嵩",num:i});
    }
    db.student.insert(arr);
    

    我设置了一个数组,然后循环2万次存入数组中,再调用一次insert方法,我们来看看时间

    0.5秒!!!这和12.6秒差别太大了吧。

    分页查询

    // 查询1~10页
    db.student.find().limit(10)
    // 查询11~20页
    db.student.find().skip(10).limit(10)
    // 查询21~30页
    db.student.find().skip(20).limit(10)
    

    Mongooes

    上面学的MongoDB的知识都是在MongoDB语言,可以在图形化工具中写,代码里面怎么写呢?这就涉及到Mongoose了,Mongoose就是用代码操作MongoDB,js代码

    首先下载Mongoose

    使用npm下载,如下

    npm i mongoose --save
    

    然后在下载的mongoose的包内写一个js文件,内容如下

    // 操纵MongoDB的第一步,连接MongoDB数据库
    const mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true});
    mongoose.connection.once("open",function(){
        console.log("数据库连接成功");
    })
    
    // 操纵MongoDB的第二步,规定数据库文档的格式
    var Schema = mongoose.Schema;
    
    var blogSchema = new Schema({
      title:  String,
      author: String,
      body:   String,
      date: { type: Date, default: Date.now }
    });
    
    var blogModel=mongoose.model("blog",blogSchema)
    
    // 操纵MongoDB的第三步,操作文档
    blogModel.create({
        title:"寻宝游戏",
        author:"许嵩",
        body:"我的新专辑,寻宝游戏",
        date:"2018"
        },function (err){
            if(!err)
                console.log("插入成功");
        }
    );
    
    

    写的很清楚了,分成三步。不需要介绍了

    MongoDB还有其他很多的命令,不打算学了,暂且学这么多,等用到在学。

    防盗链接:本博客由蜀云泉发表

  • 相关阅读:
    2月4日学习日志
    2月3日学习日志
    2月2日学习日志
    2月1日学习日志
    Result Maps collection already contains value for ***
    mapreduce入门程序之---wordcount
    利用Git上传项目到github以及遇到的问题
    看100篇架构设计的文章,不如重构一次代码
    面试中的微服务架构
    分布式架构中数据一致性常见的几个问题
  • 原文地址:https://www.cnblogs.com/yunquan/p/10849083.html
Copyright © 2020-2023  润新知