Node.js学习笔记----day05(MongonDB详情)
认真学习,认真记录,每天都要有进步呀!!!
加油叭!!!
一、es6中的find() 方法的原理
EcmaScript 6 对数组新增了很多方法
比如,find
find 接收一个方法作为参数,方法内部返回一个条件
find 会遍历所有的元素,执行你给定的带有条件返回值的函数
符合该条件的元素会作为 find 方法的返回值
如果遍历结束还没有符合该条件的元素,则返回 undefined
var users = [
{id: 1, name: '张三'},
{id: 2, name: '张三'},
{id: 3, name: '张三'},
{id: 4, name: '张三'}
]
Array.prototype.myFind = function (conditionFunc) {
//下面的函数调用相当于在这里声明了一个变量
// var conditionFunc = function (item, index) { return item.id === 4 }
for (var i = 0; i < this.length; i++) {
if (conditionFunc(this[i], i)) {
return this[i]
}
}
}
//this[i]相当于item
//i相当于index
var ret = users.myFind(function (item, index) {
return item.id === 1
//返回一个布尔值,这是一个条件,每遍历一次,就会调用一次这个方法
//如果其中遍历的某个元素在调用这个方法的过程返回true,那就要执行return this[i],那么就能马上得到myFind方法的返回值
})
console.log(ret)
二、MongonDB
1.关系型数据库与非关系型数据库(NoSQL)
表就是关系,或者说表与表之间存在关系
1.所有的关系型数据库都需要使用sql
语言来操作
2. 所有的关系型数据库操作之前都需要设计表结构
3. 而且数据表还支持约束
唯一的
主键
默认值
非空
4. 非关系型数据库非常的灵活
5. 有的非关系型数据库就是键值对 key-value
6. 但是MongoDB是长得最像关系型数据库的非关系型数据库
数据库 -----> 数据库
数据表 ----->集合(数组)
表记录 -----> (文档对象)
7. MongoDB不需要设计表结构,也就是说可以任意的在里面存数据,没有结构性这么一说
2. MongoDB数据库的基本概念
- 可以有多个数据库
- 一个数据库中可以有多个集合(相当于mysql中的表)
- 一个集合中可以有多个文档(相当于表记录)
- 文档结构很灵活,没有任何限制
- MongoDB很灵活,不用像MySQL那样先创建数据库,表,设计表结构,当你需要插入数据的时候,只需要指定往哪个数据库的哪个集合操作就可以了,一切都由MongoDB来自动完成建库建表
3.安装MongonDB
MongoDB的官网下载链接:https://www.mongodb.com/try/download/community
在官网上下载比较麻烦,推荐一个直接下载zip的地址:
64位的安装地址:http://dl.mongodb.org/dl/win32/x86_64
32位的安装地址:http://dl.mongodb.org/dl/win32/i386
配置环境变量
查看版本信息
$ mongod --version
4. 启动和关闭MongoDB数据库
启动:
# mongodb默认使用执行 mongod 命令所处的盘符根目录下的 /data/db作为自己的数据村春目录
# 所以在第一次执行命令之前要先自己手动新建一个 / data/db
# 如果是在C盘,那就在C盘根目录下创建,如果是在D盘,那就在D盘下创建
mongod
创建好 /data/db目录后 再执行mongod
说明mongodb已开启成功
如果想要修改默认的存储路径的话,可以
mongod --dbpath=数据存储目录路径
停止:
在开启服务的控制台 ,直接 ctrl + c
即可停止
5.连接和退出数据库
连接:
# 该命令默认连接本机的 MongDB 服务
# 连接的前提是要先开启数据库
mongo
退出:
# 在连接状态输入 exit 退出连接
exit
6. MongoDB基本命令
show dbs
(查看显示所有数据库)
db
(查看当前操作的数据库)
默认会连接test
show dbs
没有test
,原因是test
现在没有数据,当往test
中插入数据时,test
就会自动被创建出来了use 数据库名称
(切换到指定的数据库,如果没有自动新建)
当
show dbs
的时候,还是没有itcast
插入集合数据
MongoDB的增删改查就是在调它自己的API,类似于JS语法
存数据相当于在存对象可以认为student就是一个数组集合相当于是一个数组
显示集合
查询集合中的所有数据
MongoDB在存数据的时候非常灵活,没有任何结构上的限制,插入数据时,不用像关系型数据库那样去更改表结构,相当于JavaScript的数组和对象,是动态的,可以任意创建和存储
7. 在Node.js中如何操作MongoDB数据库
- 使用官方的
mongodb
包来操作
node.js-mongoDB仓库
github仓库的官方文档
- 使用第三方包
mongoose
来操作MongoDB数据库
第三方包:mongoose
基于MongoDB官方的mongodb
包再一次做了封装
8. mongoose
官网:https://mongoosejs.com/
官方指南:https://mongoosejs.com/docs/guide.html
官方API文档:https://mongoosejs.com/docs/api.html
使用:
初始化 npm init -y
安装 mongoose
- hello world
//es6语法
//导入mongoose包
const mongoose = require('mongoose');
// 连接 MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true, useUnifiedTopology: true});
// 创建一个模型
// 就是在设计数据库
// MongoDB 是动态的,非常灵活,只需要在代码中设计你的数据库就可以了
// mongoose 这个包就可以让你的设计编写过程变的非常的简单
const Cat = mongoose.model('Cat', { name: String });
//会自动帮助我们创建一个集合(mysql中的表)
//虽然名称时大写的,但是它会自动帮助我们转换为小写复数的名称
//持久化保存Kitty实例
const kitty = new Cat({ name: 'Zildjian' });
kitty.save().then(() => console.log('meow'));
//es5语法
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', { useMongoClient: true });
//mongoose.Promise = global.Promise;
var Cat = mongoose.model('Cat', { name: String });
// 实例化一个 Cat
var kitty = new Cat({ name: 'Zildjian' });
// 持久化保存 kitty 实例
kitty.save(function (err) {
if (err) {
console.log(err);
} else {
console.log('meow');
}
});
node执行命令后的结果:
遍历循环存储10个对象的栗子:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true, useUnifiedTopology: true});
const Cat = mongoose.model('Cat', { name: String });
//遍历循环存储10个对象
for(var i =0 ;i<10;i++){
var kitty = new Cat({ name: '喵喵' + i });
kitty.save().then(() => console.log('meow'));
}
9. mongoose开始(设计Schema发布model)
- 连接数据库
指定连接的数据库不需要存在,当你插入第一条数据之后就会自动被创建出来
mongoose.connect('mongodb://localhost/itcast')
- 设计文档结构(表结构)
字段名称就是表结构中的属性名称 约束的目的是为了保证数据的完整性
不要有脏数据
var userSchema = new Schema({
username: {
type: String,
required: true // 必须有
},
password: {
type: String,
required: true
},
email: {
type: String
}
})
- 将文档结构发布为模型
mongoose.model 方法就是用来将一个架构发布为 model 第一个参数:传入一个大写名词单数字符串用来表示你的数据库名称
mongoose 会自动将大写名词的字符串生成 小写复数 的集合名称
例如这里的 User 最终会变为 users 集合名称 第二个参数:架构 Schema
返回值:模型构造函数
var User = mongoose.model('User', userSchema)
- 当我们有了模型构造函数之后,就可以使用这个构造函数对 users 集合中的数据进行操作了(增删改查)
10.增加数据
var admin = new User({
username:'Chinatsu',
password:'123456',
email:'admin@qq.com'
})
admin.save(function(err,ret){
if(err){
console.log('保存失败')
}
else {
console.log('保存成功')
console.log(ret)
}
})
来吧展示:
11.查询数据
find() (查询所有)
//查询数据
//查询所有数据
User.find(function(err,ret){
if(err){
console.log('查询失败')
}
else {
console.log(ret)
}
})
来吧展示:
find() (按条件查询所有)
//带有条件的查询
User.find({username: 'Tom'}, function (err, ret) {
if (err) {
console.log('查询失败')
} else {
console.log(ret)
}
})
来吧展示:
注意:哪怕只有一条数据,也会放到对应的数组当中
findOne() (按条件查询单个)
// findOne() 查询的直接是一个对象,而不是一个数组
User.findOne({
username: 'Tom'
}, function (err, ret) {
if (err) {
console.log('查询失败')
} else {
console.log(ret)
}
})
来吧展示:
如果findOne()没有给条件,那么查询到的就是插入的第一条数据
//findOne()不给条件查询
User.findOne(function (err, ret) {
if (err) {
console.log('查询失败')
} else {
console.log(ret)
}
})
来吧展示:
带有多条件的查询
12.删除数据
remove()(根据条件删除所有)
//删除数必须带上条件
User.remove({username:"Tom"},function(err,ret){
if(err){
console.log('删除失败')
}
else{
console.log('删除成功')
console.log(ret)
}
})
来吧展示:
再次查询所有数据,发现Tom这一条数据已经不存在了
来吧展示:
findOneAndRemove() (根据条件去删除一个)
findByIdAndRemove() (根据id
去删除一个)
13.更新数据
update() (根据条件去更新所有)
findOneAndUpDate() (根据条件去更新一个)
findByIdAndUpdate()(根据id
去更新一个)
User.findByIdAndUpdate('5f866f1f005658400416fdfc', {
password: '000'
}, function (err, ret) {
if (err) {
console.log('更新失败')
} else {
console.log('更新成功')
console.log(ret)
}
})
来吧展示:
Node.js学习笔记----day05(MongonDB详情)的更多相关文章
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- Node.js学习笔记(3):NPM简明教程
Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...
- 系列文章--Node.js学习笔记系列
Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...
- Node.js学习笔记(2):基本模块
Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...
- Node.js学习笔记(1):Node.js快速开始
Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...
- Node.js学习笔记(4):Yarn简明教程
Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...
- Node.js学习笔记(一)
1.回调函数 node是一个异步事件驱动的平台,所以在代码中我们经常需要使用回调函数. 例: setTimeout(function(){ console.log('callback is calle ...
- Node.js学习笔记(一):快速开始
最近接了一个node项目,虽然最后顺利完成了,但是由于第一次实战,整个过程是赶出来的,许多地方一知半解.现在项目结束了,就静下心来系统地学一学,理一理,读书不忘拿笔,既然读书了,当然就要记点东西.一方 ...
- Node.js学习笔记(一)基础介绍
什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- node.js学习笔记(三)——事件循环
要理解事件循环,首先要理解事件驱动编程(Event Driven Programming).它出现在1960年.如今,事件驱动编程在UI编程中大量使用.JavaScript的一个主要用途是与DOM交互 ...
随机推荐
- 2022春每日一题:Day 36
题目:[JLOI2013]删除物品 直接做显然比较复杂,这个题是说对顶栈,但是可以把两个栈拼在一起,记录一下栈顶的下标,然后这样这题就可以转化为线性上的操作查询了,用树状数组简单维护一下就ok了(某个 ...
- C++ 一个简洁的CHECK宏
#define CHECK2(condition, message) \ (!(condition)) ? (std::cerr << "Assertion failed: (& ...
- 启动homestead虚拟机 vagrant up执行后,提示Timed out while waiting for the machine to boot
最近在启动homestead虚拟机时,总会卡在ssh验证这,几分钟后,就报timed out-- 以往都是重启电脑后,再次执行vagrant up后就能正常启动. 今日重启电脑很多次也无用. 查询解决 ...
- 关于linux建立u盘legacy启动方式引导
前言 我一直在用linux,但是我在linux制作pe启动盘无法实现,windows有很多制作pe启动盘的软件,如大白菜,u深度什么的,但是linux没有对应的软件,所以我想写一个类似的工具,那么就有 ...
- <一>智能指针基础
代码1 int main(){ //裸指针,手动开辟,需要自己释放,如果忘记了或者因为 //程序逻辑导致p没有释放,那么就会导致内存泄漏 int *p=new int(10); if(***){ re ...
- 用excel表画一个乐高
一.背景:在商场看到一个超级玛丽的乐高图感觉使用excel的颜色填充也能画出来,并且可以借助python来实现 二.excel表如何绘制正方形:1.统一设置行高与列宽excel表单元格的行与列的默认计 ...
- [论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL)
[论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL) 文章: The Linear Monge-Kantorovitch Linear Colour Mapping f ...
- 【Java SE进阶】Day12 函数式接口、函数式编程(Lambda表达式)
一.函数式接口介绍 1.概念 仅有一个抽象方法的接口 适用于函数式编程(Lambda使用的接口) 语法糖:方便但原理不变,如for-each是Iterator的语法糖 Lambda≈匿名内部类的语法糖 ...
- 【笔面试真题】ThoughtWorks-笔试-2022年1月21日
一.选择填空判断 2n-1 二.算法题 算法题1:配对括号 算法题2:计算有效票数? 算法题3:求字符串中指定单词的数量 package com.jhliu20.real; import java.u ...
- 复杂mysql/多表查询
目录 多表查询的两种方法 sql语句基础语法补充 concat / existe / 表字段 增加 修改 删除 复杂sql练习题 多表查询的两种方法 方式1:连表操作 inner join 内连接 s ...