写在前面

hello,小伙伴们,我是 pubdreamcc ,本篇文章依旧出至于我的 GitHub仓库 node学习教程 ,如果你觉得我写的还不错,欢迎给个 star ,小伙伴们的 star 是我持续更新的动力 !

node学习教程GitHub

安装 mongoDB

安装这里,我就不详细介绍,大家可以根据官网选择匹配自己电脑系统的版本安装即可。

mongoDB download地址: download

下载下来之后,点击打开直接下一步,下一步就 ok 了。

初体验

  1. 配置环境变量

安装完成后,会在安装目录下面生成一个 mongoDB 的文件夹,打开文件夹,进入 bin 文件夹中,把这里的路径配置成环境变量。

  1. 创建存储数据库文件 data

在任意盘符根目录下创建一个 data 目录,用来存放数据库文件。 mongoDB 会自动把自己安装位置的盘符根目录下的 data 文件夹作为自己的数据存储目录,这里也可以直接在安装位置所在盘符创建。

  1. 启动 mongoDB 数据库

如果 data 目录创建在安装位置的盘符根目录下,直接

打开命令行,敲入:

mongod

如果是其他位置,则需要指定数据存放的位置:

mongod --dbpath 文件路径

如果看到输出: waiting for connections on port 27017 说明启动数据库成功。

  1. 连接数据库

再打开一个命令行,敲入 mongo ,则会默认连接到本地开启的数据库。好了,到这里我们就完成了如何开启一个 mongoDB 数据库了,接下来只需往数据库里存数据,操作数据即可。

MongoDB 概念解析

mongodb中有三个基本核心的概念:

  • 文档

  • 集合

  • 数据库

它们之间是逐层包含的关系,一个集合可以包含多个文档,一个数据库可以有多个集合,下面听我逐一道来:

文档 : 文档是一个键值(key-value)对(即BSON),本质类似于json对象 的键值对。

{"name":"pubdreamcc", "age": 24}

集合:集合就是 MongoDB 文档组,实质上就是包含多个对象的数组。

比如,我们可以将以下不同数据结构的文档插入到集合中:

{"name":"pubdreamcc"}
{"name":"pubdreamcc1","name":"pubdreamcc2"}
{"name":"pubdreamcc3","name":"pubdreamcc4","num":5}

数据库(dataBase)

这里的数据库概念同 关系型数据库中的数据库概念一致,数据库可以包含多个集合。

下面给出一张图用来表示 mongoDB 中的一些概念同 SQL 概念 的 对比,辅助理解。

mongoDB基本操作

在刚才我们连接上本地数据库之后,在这个命令行,我们可以进行很多 mongoDB 提供的增删改查等的基本操作,且听我一一道来。

  1. 创建数据库 : use 数据库名称

如果数据库不存在,则创建数据库,否则切换到指定数据库。

MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。

  1. 查看所有数据库: show dbs

  2. 删除数据库: db.dropDatabase(),你可以使用 db 命令查看当前数据库名。

  3. 创建集合: db.createCollection(集合名称)

  4. 查看已有集合: show collections

  5. 删除集合:db.集合名称.drop()

如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false

  1. 插入文档:db.集合名称.insert(document)。往指定集合插入文档,文档的数据结构和 JSON 基本一样。

  2. 更新文档: update() 方法用于更新已存在的文档,语法格式:

db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)

参数说明

  • query : update的查询条件,类似sql update查询内where后面的。

  • update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的。

  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

  • writeConcern :可选,抛出异常的级别。

  1. 删除文档:
db.collection.remove(
<query>,
<justOne>
)

参数说明

  • query :(可选)删除的文档的条件。

  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。

  • writeConcern :(可选)抛出异常的级别。

  1. 删除集合所有数据:db.collection.remove({})

  2. 查询文档:db.collection.find(query, projection)

参数说明

  • query :可选,使用查询操作符指定查询条件。

  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

PS:

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

db.col.find().pretty()

pretty() 方法以格式化的方式来显示所有文档。

  1. 查询一个文档(匹配条件的第一个):db.collection.findOne()

Node操作mongoDB

方法一:

  • 使用 mongoDB 官方提供的 node mongodb driver mongoDB ,这种方法是官方提供的,感兴趣的同学可以去 npm 官网查找文档,这里推荐下面一种方法。

mongoDB npm 文档

方法二:

  • 使用 mongoose

Mongoose 是在 node.js 环境下对 mongodb 进行便捷操作的对象模型工具。

官方 api 文档

下面说明下 mongoose 的具体用法。

  1. 安装 mongoose
npm install mongoose

安装完成后,打开mongodb。命令行敲入:mongod,即可打开 mongodb

  1. 利用mongoose连接mongodb

新建一个js文件,引入mongoose,这里可以参照官网 写的一个 hello world

const mongoose = require('mongoose')
// 连接数据库
mongoose.connect('mongodb://数据库地址(包括端口号)/数据库名称', (err, ret) => {
if (err) {
console.log('连接失败')
} else {
console.log('连接成功')
}
})

这样,我们就可以连接上数据库了,注意:如果没有指定数据库名称,则默认连接 test 数据库。

  1. 创建 Schema ,设计文档结构

Schema 到底是个什么东西呢,我们在往数据库插入数据之前是不是应该得稍微设计下文档的结构,也就是关系数据库中表的结构啥的,因为有一定的设计才使得数据的完整性,不会产生脏数据,Schema就是用来干这个事情的,我们看下官方的介绍

Schema 主要用于定义 MongoDB 中集合 Collection 里文档 document 的结构。mongoose 对表结构的定义,每个 Schema 会映射到mongodb中的一个 collectionSchema 不具备操作数据库的能力。

定义Schema非常简单,指定字段名和类型即可,支持的类型包括以下8种:

String      字符串
Number 数字
Date 日期
Buffer 二进制
Boolean 布尔值
Mixed 混合类型
ObjectId 对象ID
Array 数组

通过mongoose.Schema来调用Schema,然后使用new方法来创建schema

// 引入Schema
const Schema = mongoose.Schema
// 通过 new 创建一个Schema
const userSchema = new Schema({
// 这里来设计文档的结构,后面插入集合的每一个文档必须是以下指定的结构
name: {
type: String,
required: true // 规定 name 是必须有的字段
},
password: {
type: String,
required: true
},
email: {
type: String
}
})

通过以上的实例,我们就创建了一个 userSchema 的架构,规定了每个文档中必须有 namepassword 字段,且类型为 Stringemail 字段类型为 String,有或没有都可以。

  1. Schema 发布为 model (模型)

简单说就是model是由 Schema 生成的模型,可以对数据库的操作。model的每一个实例(instance)就是一个文档。

把 Schema 发布为模型只需调用mongoose的 mongoose.model() 方法即可,mongoose.model() 接收两个参数,第一个参数表示模型的名称,第二个参数是 Schema,返回值为模型构造函数。这里一定得把第一个参数设置成和 mongoose.model() 的返回值相同,否则会出错。最后得到的集合名称就为模型名称的小写形式,如果模型名称最后一个字符是字母,则变成复数形式,如果最后一个是数字,则不变,比如:模型名称:User,得到的集合名称为: users,模型名称为:User1, 得到的集合名称为;user1

// 把Schema 发布为模型
const User = mongoose.model('User', userSchema)
  1. 通过模型构造函数,可以对数据库进行一系列增删改查的操作。

好了,我们经过以上的步骤,最后就可以通过 User 模型构造函数操作数据库了。

mongoose 操作 mongoDB

增加数据

实例化一个模型构造函数就得到一个具体文档。

const user = new User({
// 传入具体的数据信息,必须和之前的Schema 配置的结构一致
name: 'pubdreamcc',
password: '123456',
email: '333@pubdreamcc.com' // 可有可无
}) // 通过save()方法持久化存储数据 user.save((err, ret) => {
if (err) {
console.log('保存失败')
} else {
console.log('保存成功')
console.log(ret) // ret 就是刚新增加的文档
}
})

ok, 通过上面两步我们就已经保存了一条数据到数据库中了,就是怎么简单。

查询数据

查询数据这里有好几个 API , 可以看下 mongoose 的官网:

  • find()
  • findById()
  • findOne()

具体的用法和之前在控制台 操作mongoDB 数据类似,不清楚的同学可以查看本章第一节知识点: mongoDB数据库的使用

这里选取一个findOne代表

User.findOne({name: 'pubdreamcc'}, (err, ret) => {
if (err) {
console.log('查询失败')
} else {
console.log(ret) // ret 即为查询出来的那一条文档
}
})

findOne() 会查找匹配的第一个文档出来,通常传入一个查找条件(对象),这里是从数据库查找 namepubdreamcc 的文档出来。

删除数据

删除数据同样也有好几个方法,这里参照官网 api :

  • remove()
  • findOneAndRemove()
  • findByIdAndRemove()

用法其实和更新数据,包括前面说到的查找数据类似,remove() 会删除所有匹配的全部文档,findOneAndRemove() 会删除匹配的第一个文档,findByIdAndRemove() 通过唯一的id值删除某一个文档。

这里选取findByIdAndRemove() 来说明,其他的小伙伴可以去 mongoose 官网 api 查询,我就不再反复说了,用法很简单,大家看一下都懂的。

mongoose 官网 api: api document

User.findByIdAndRemove('id值', (err, ret) => {
if (err) {
console.log('删除失败')
} else {
console.log('删除成功')
console.log(ret) // ret 即为删除信息反馈对象,包括成功删了几条数据等
}
})

更新数据

更新数据也有几个 api 可以供我们使用,我就罗列下,然后也是选取一个加以说明,其他的小伙伴们可以去官网查看 api 即可。

  • findByIdAndUpdate()
  • update()
  • findOneAndUpdate()

这里选取 update() 来演示下:

User.update({name: 'pubdreamcc'}, {email: '111@pubdreamcc.com'}, (err, ret) => {
if (err) {
console.log('更新失败')
} else {
console.log('更新成功')
}
})

update() 方法会把所有满足条件的数据都更新,上面我们已经把 name 为: pubdreamcc 的所有文档的email 都修改为 111@pubdreamcc.com

总结

本文也是我查阅相关资料,看了很多mongoDB的资料总结而来,如果有那些地方有差错,欢迎留言评论。

需要演示的源代码可以去GitHub仓库查看。

ok,that's all , thank you !

mongoDB看这篇就够了的更多相关文章

  1. ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

  2. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...

  3. 想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了!

    想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了!   很多通信系统发展到某种程度都会有小型化的趋势.一方面小型化可以让系统更加轻便和有效,另一方面,日益发展的IC**技术可以用更低的成本生产 ...

  4. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...

  5. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

  6. Vue学习看这篇就够

    Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的 ...

  7. 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...

  8. Pycharm新手教程,只需要看这篇就够了

    pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...

  9. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

随机推荐

  1. 20180606模拟赛T4——数学游戏

    数学游戏 题目描述: 小T又发脑残了,没错,她又要求奇怪的东西,这次她想知道[X,Y]之间整数有多少可以表示成K个不同的B的幂的和形势.如\(x,y,k,b=15,20,2,2\),则有: \[17= ...

  2. luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)

    题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...

  3. 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest

    2014-2015 ACM-ICPC, Asia Tokyo Regional Contest A B C D E F G H I J K O O O O   O O         A - Bit ...

  4. [PHP] Laravel 5.5 图片上传功能

    以Laravel 5.5 框架为主,进行文件上传功能的实现如下: 一.配置文件修改 打开 config/filesystems.php 文件在 ‘disks’ 数组中添加如下代码 //自定义 'upl ...

  5. 1. Spring Cloud Greenwich SR2 概览

    Spring Cloud provides tools for developers to quickly build some of the common patterns in distribut ...

  6. idea输出文件夹没有jsp页面

    目录 idea输出文件夹没有jsp页面 问题描述 解决办法 idea输出文件夹没有jsp页面 问题描述 开始创建没有使用web的模板, 自己创建tomcat等配置, 后来启动发现没有index.jsp ...

  7. 关联分析-MIC

    MIC:the Maximal Information Coefficient,是用网格分法判断数据的集中程度的一个标准. MIC所依据的理念是,如果2个变量之间存在着一种关系,那么就应该有一种方法在 ...

  8. 记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法

    记一次查询超时的解决方案The timeout period elapsed...... https://www.cnblogs.com/wyt007/p/9274613.html Exception ...

  9. 浅谈设计模式-visitor访问者模式

    先看一个和visitor无关的案例.假设你现在有一个书架,这个书架有两种操作,1添加书籍2阅读每一本书籍的简介. //书架public class Bookcase { List<Book> ...

  10. java8新特性七-Date Time API

    Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: 非线程安全 − java.ut ...