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:\mongodb\conf的目录下创建一个名为master.cfg的文件,内容为dbpath=d:\data。然后运行命令

mongod –config c:\mongodb\conf\master.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还有其他很多的命令,不打算学了,暂且学这么多,等用到在学。

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

MongoDB学习笔记一:MongoDB基础的更多相关文章

  1. Mongodb学习笔记一(Mongodb环境配置)

    Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...

  2. MongoDB学习笔记(一) MongoDB介绍及安装(摘)

    MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C++开发.Mongo的官方网 ...

  3. Mongodb学习笔记二(Mongodb基本命令)

    第二章 基本命令 一.Mongodb命令 说明:Mongodb命令是区分大小写的,使用的命名规则是驼峰命名法. 对于database和collection无需主动创建,在插入数据时,如果databas ...

  4. MongoDb 学习笔记(一) --- MongoDb 数据库介绍、安装、使用

    1.数据库和文件的主要区别 . 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 . 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 ...

  5. MongoDB学习笔记一(MongoDB介绍 + 基本指令 + 查询语句)

    什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供可扩 ...

  6. MongoDB学习笔记(一) MongoDB介绍及安装

    转自:http://database.51cto.com/art/201103/247882.htm http://baike.baidu.com/link?url=b6B3dVSCnQauCX-Ep ...

  7. MongoDB学习笔记-认识MongoDB

    学习参考地址 http://www.runoob.com/mongodb NoSql 流行的数据库Oracle,SqlServer,MySql为关系性数据库,相对的,也有非关系性数据库,统称为NoSq ...

  8. Mongodb学习笔记三(Mongodb索引操作及性能测试)

    第三章 索引操作及性能测试 索引在大数据下的重要性就不多说了 下面测试中用到了mongodb的一个客户端工具Robomongo,大家可以在网上选择下载.官网下载地址:http://www.robomo ...

  9. Mongodb学习笔记四(Mongodb聚合函数)

    第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...

  10. MongoDB学习笔记—02 MongoDB入门

    Mongodb的基本概念 文档:是MongoDB中数据的基本单元,类似于关系型数据库中的行. 集合:多个文档组成一个集合,类似于关系型数据库中的表. 数据库:MongoDB的当个实例可以容纳多个独立的 ...

随机推荐

  1. 初学 Size Balanced Tree(bzoj3224 tyvj1728 普通平衡树)

    SBT(Size Balance Tree), 即一种通过子树大小(size)保持平衡的BST SBT的基本性质是:每个节点的size大小必须大于等于其兄弟的儿子的size大小: 当我们插入或者删除一 ...

  2. [NgRx 8] Basic of NgRx8

    1. First step is creating action creator Action name should be clear which page, which functionality ...

  3. Centos7 源码安装PostgreSQL Citus集群 (转载)

    citus的分布式集群目前在苏宁大规模应用,苏宁陈华军也做了很多技术分享和博客介绍.目前所有的教程都是rpm和pg一起安装,个人不喜欢,毕竟citus定位是个插件,我想在我已安装的pg上源码装一个ci ...

  4. bzoj 2969: 矩形粉刷 概率期望+快速幂

    还是老套路:期望图上的格子数=$\sum$ 每个格子被涂上的期望=$\sum$1-格子不被图上的概率 这样的话就相对好算了. 那么,对于 $(i,j)$ 来说,讨论一下上,下,左,右即可. 然后发现四 ...

  5. JMX类型监控

    zabbix服务器配置 zabbix_server.conf: JavaGateway=10.42.239.219 #JavaGateway的IP JavaGatewayPort=10052 #Jav ...

  6. 怎么通过django模板输出双花括号{{}}

    https://segmentfault.com/q/1010000000685399

  7. AtCoder Grand Contest 006 题解

    传送门 \(A\) 咕咕 const int N=105; char s[N],t[N];int n; inline bool eq(R int k){fp(i,1,k)if(s[n-k+i]!=t[ ...

  8. 【一起来烧脑】一步Sass学会体系

    [外链图片转存失败(img-G32u6UQ8-1563572536495)(https://upload-images.jianshu.io/upload_images/11158618-a03a58 ...

  9. namenode 优化 mv慢的问题

    问题现象 问题描述 公司业务程序需求每30分钟mv 一万多个文件,如果三十分钟之内当前的文件内容没有全部移动,程序报错并且停止. 分析 通过分析,发现在启动balancer和不启动balancer的情 ...

  10. Cisco实验图