mongoDB看这篇就够了
写在前面
hello,小伙伴们,我是 pubdreamcc ,本篇文章依旧出至于我的 GitHub仓库 node学习教程 ,如果你觉得我写的还不错,欢迎给个 star ,小伙伴们的 star 是我持续更新的动力 !
node学习教程GitHub
安装 mongoDB
安装这里,我就不详细介绍,大家可以根据官网选择匹配自己电脑系统的版本安装即可。
mongoDB download地址: download
下载下来之后,点击打开直接下一步,下一步就 ok 了。
初体验
- 配置环境变量
安装完成后,会在安装目录下面生成一个 mongoDB 的文件夹,打开文件夹,进入 bin 文件夹中,把这里的路径配置成环境变量。
- 创建存储数据库文件
data
在任意盘符根目录下创建一个 data 目录,用来存放数据库文件。 mongoDB 会自动把自己安装位置的盘符根目录下的 data 文件夹作为自己的数据存储目录,这里也可以直接在安装位置所在盘符创建。
- 启动 mongoDB 数据库
如果 data 目录创建在安装位置的盘符根目录下,直接
打开命令行,敲入:
mongod
如果是其他位置,则需要指定数据存放的位置:
mongod --dbpath 文件路径
如果看到输出: waiting for connections on port 27017 说明启动数据库成功。
- 连接数据库
再打开一个命令行,敲入 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 提供的增删改查等的基本操作,且听我一一道来。
- 创建数据库 :
use 数据库名称。
如果数据库不存在,则创建数据库,否则切换到指定数据库。
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
查看所有数据库:
show dbs删除数据库:
db.dropDatabase(),你可以使用 db 命令查看当前数据库名。创建集合:
db.createCollection(集合名称)查看已有集合:
show collections删除集合:
db.集合名称.drop()
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
插入文档:
db.集合名称.insert(document)。往指定集合插入文档,文档的数据结构和JSON基本一样。更新文档:
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:可选,抛出异常的级别。
- 删除文档:
db.collection.remove(
<query>,
<justOne>
)
参数说明
query:(可选)删除的文档的条件。justOne: (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。writeConcern:(可选)抛出异常的级别。
删除集合所有数据:
db.collection.remove({})查询文档:
db.collection.find(query, projection)
参数说明
query:可选,使用查询操作符指定查询条件。projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
PS:
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.col.find().pretty()
pretty() 方法以格式化的方式来显示所有文档。
- 查询一个文档(匹配条件的第一个):
db.collection.findOne()
Node操作mongoDB
方法一:
- 使用
mongoDB官方提供的node mongodb driver包mongoDB,这种方法是官方提供的,感兴趣的同学可以去 npm 官网查找文档,这里推荐下面一种方法。
方法二:
- 使用
mongoose
Mongoose 是在 node.js 环境下对 mongodb 进行便捷操作的对象模型工具。
官方 api 文档
下面说明下 mongoose 的具体用法。
- 安装
mongoose
npm install mongoose
安装完成后,打开mongodb。命令行敲入:mongod,即可打开 mongodb
- 利用mongoose连接mongodb
新建一个js文件,引入mongoose,这里可以参照官网 写的一个 hello world 。
const mongoose = require('mongoose')
// 连接数据库
mongoose.connect('mongodb://数据库地址(包括端口号)/数据库名称', (err, ret) => {
if (err) {
console.log('连接失败')
} else {
console.log('连接成功')
}
})
这样,我们就可以连接上数据库了,注意:如果没有指定数据库名称,则默认连接 test 数据库。
- 创建
Schema,设计文档结构
Schema 到底是个什么东西呢,我们在往数据库插入数据之前是不是应该得稍微设计下文档的结构,也就是关系数据库中表的结构啥的,因为有一定的设计才使得数据的完整性,不会产生脏数据,Schema就是用来干这个事情的,我们看下官方的介绍
Schema 主要用于定义 MongoDB 中集合 Collection 里文档 document 的结构。mongoose 对表结构的定义,每个 Schema 会映射到mongodb中的一个 collection,Schema 不具备操作数据库的能力。
定义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 的架构,规定了每个文档中必须有 name, password 字段,且类型为 String,email 字段类型为 String,有或没有都可以。
- 把
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)
- 通过模型构造函数,可以对数据库进行一系列增删改查的操作。
好了,我们经过以上的步骤,最后就可以通过 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() 会查找匹配的第一个文档出来,通常传入一个查找条件(对象),这里是从数据库查找 name 为 pubdreamcc 的文档出来。
删除数据
删除数据同样也有好几个方法,这里参照官网 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看这篇就够了的更多相关文章
- ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...
- .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了
作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...
- 想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了!
想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了! 很多通信系统发展到某种程度都会有小型化的趋势.一方面小型化可以让系统更加轻便和有效,另一方面,日益发展的IC**技术可以用更低的成本生产 ...
- [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了
[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...
- 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 ...
- Vue学习看这篇就够
Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的 ...
- 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...
- Pycharm新手教程,只需要看这篇就够了
pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
随机推荐
- Pandas | GroupBy 分组
任何分组(groupby)操作都涉及原始对象的以下操作之一: 分割对象 应用一个函数 结合的结果 在许多情况下,我们将数据分成多个集合,并在每个子集上应用一些函数.在应用函数中,可以执行以下操作: 聚 ...
- maker使用说明书
1.以自带的示例数据为例 dpp_contig.fasta dpp_est.fasta dpp_protein.fasta te_proteins.fasta 2.生成控制文件 控制文件是特定于运行的 ...
- 算法——回文(palindrome)
回文(palindrome):指的是从头读到尾与从尾读到头一模一样的字符串. 分别在C.Java与Python实现回文检测: C: #include <stdio.h> #include ...
- 蒟蒻所见之DP
本文有错是正常的,因为这只是一部成长史,并非教学博文. 会常年更下去. 2019.10.24 DP,核心只是"表格法"而已. DP题真正所考察的,是: 1.对问题的描述.简化以及归 ...
- 网络测试工具netperf(转)
http://pangyi.github.io/blog/20141210/wang-luo-ce-shi-gong-ju-netperf/ 网络测试工具netperf 2014年12月10日 一般我 ...
- github下载速度慢甚至多次失败,通过码云的导入功能导入github项目到码云上,然后再从码云下载
github下载速度慢甚至多次失败,通过码云的导入功能导入github项目到码云上,然后再从码云下载 参考 https://blog.csdn.net/kcx64/article/details/83 ...
- 记一次node节点异常排查
一.背景 公司进行kubernetes服务重启演练,集群重启后所有服务正常,仅node2节点处于notready状态 二.排查过程 查看对应节点的详细信息,发现kubelet一直处于starting状 ...
- thinkphp伪静态怎么实现
thinkphp如何实现伪静态? 去掉 URL 中的 index.php ThinkPHP 作为 PHP 框架,是单一入口的,那么其原始的 URL 便不是那么友好.但 ThinkPHP 提供了各种机制 ...
- 本周使用angular7所遇到的一些问题
前言 本周在使用angular7所遇到的一些问题,学习是不断的循序渐进的过程,在本周完成对应的工作后,也要抽出一些时间用来学习,比较我们公司10点上班,我一般9点就会到,在这一个小时内看看博客,写写笔 ...
- centos 7 下 rabbitmq 3.8.0 & erlang 22.1 源码编译安装
centos 7 下 rabbitmq 3.8.0 & erlang 22.1 源码编译安装 安装前请检查好erlang和rabbitmq版本是否相匹配参考:RabbitMQ Erlang V ...