使用mongoose 在 Node中操作MongoDB数据库

MongoDB

关系型和非关系型数据库

关系型数据库(表就是关系,或者说表与表之间存在关系)。

  • 所有的关系型数据库都需要通过sql语言来操作
  • 所有的关系型数据库在操作之前都需要设计表结构
  • 而且数据表还支持约束
    • 唯一的
    • 主键
    • 默认值
    • 非空

非关系型数据库

  • 非关系型数据库非常的灵活
  • 有的关系型数据库就是key-value对儿
  • 但MongDB是长得最像关系型数据库的非关系型数据库
    • 数据库 -》 数据库
    • 数据表 -》 集合(数组)
    • 表记录 -》文档对象

一个数据库中可以有多个数据库,一个数据库中可以有多个集合(数组),一个集合中可以有多个文档(表记录)

{qq:{user:[{},{},{}...]}
}
  • 也就是说你可以任意的往里面存数据,没有结构性这么一说

安装

  • 下载

    • 下载地址:https://www.mongodb.com/download-center/community
      在这里插入图片描述
      在这里插入图片描述
  • 安装
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

一直Next即可。。。
在这里插入图片描述
这是安装MongoDB的服务。这是4之后的版本有的,这里安装了以后,就不用配置dbpath和logpath,也不用配置服务了。安装完了,就直接可以使用MongoDB。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

npm i mongoose
  • 配置环境变量
  1. 找到安装好的MongoDB文件夹下的bin目录
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 最后输入mongod --version测试是否安装成功
    在这里插入图片描述

启动和关闭数据库

启动:

# mongodb 默认使用执行mongod 命令所处盼复根目录下的/data/db作为自己的数据存储目录
# 所以在第一次执行该命令之前先自己手动新建一个 /data/db
mongod

如果想要修改默认的数据存储目录,可以:

mongod --dbpath = 数据存储目录路径

注意:mongodb 4版本以上,不需要再手动区启动服务,默认已经自动启动了

停止:

在开启服务的控制台,直接Ctrl+C;
或者直接关闭开启服务的控制台。

连接数据库

连接:

# 该命令默认连接本机的 MongoDB 服务
mongo

退出:

# 在连接状态输入 exit 退出连接
exit

在这里插入图片描述

基本命令

  • show dbs

    • 查看数据库列表(数据库中的所有数据库)
  • db

    • 查看当前连接的数据库
      在这里插入图片描述
  • use 数据库名称

    • 切换到指定的数据库,(如果没有会新建)
      在这里插入图片描述
      在这里插入图片描述
  • show collections

    • 查看当前目录下的所有数据表
      在这里插入图片描述
  • db.表名.find()

    • 查看表中的详细信息
      在这里插入图片描述

二、在Node中如何操作MongoDB数据库

使用官方的MongoDB包来操作

​ http://mongodb.github.io/node-mongodb-native/
https://www.npmjs.com/package/mongodb

使用第三方包mongoose来操作MongoDB数据库(推荐)

​ 第三方包:mongoose基于MongoDB官方的mongodb包再一次做了封装,名字叫mongoose,是WordPress项目团队开发的。

​ https://mongoosejs.com/
在这里插入图片描述

mongoose的第一个demo

在这里插入图片描述

新建一个项目文件夹:mongoose-demo,然后cmd 执行 npm init -y:
在这里插入图片描述
执行npm install mongoose
在这里插入图片描述

demo1.js:

// 1. 引入包
const mongoose = require('mongoose');// 2. 连接MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true,useUnifiedTopology: true
});// 3. 创建一个模型
// 就是在设计数据库
// MongoDB是动态的,非常灵活,只需要在代码中设计你的数据库就可以了
// mongoose 这个包就可以让你的设计编写过程变得非常的简单
const Cat = mongoose.model('Cat', {name: String
});// 4. 实例化一个Cat
const kitty = new Cat({name: 'Zildjian'
});// 5. 持久化保存kitty实例
kitty.save().then(() => console.log('meow'));

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

mongoose:

官网:http:/mongoosejs.com/
官方指南:http:/mongoosejs.com/docs/guide.html
官方API文档:http:/mongooseis.com/docs/api.html

mongoose基本使用:

1. 设计Schema发布Model:
// 1.导包
const mongoose = require('mongoose')const Schema = mongoose.Schema// 2.连接数据库
// 这里指定连接的数据库mydb可以不需要存在,当你插入第一条数据之后就会帮你自动创建这个数据库
mongoose.connect('mongodb://localhost/mydb')// 3.设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
const userSchema = new Schema({username: {type: String,require: true // 必须有该属性},password: {type: String,require: true},email: {type: String}
});// 3.将文档结构发布为模型
// mongoose.model() 就是用来将一个架构发布为 model
// 第一个参数: 传入一个大写名词单数字符串,用来表示你的数据库名称
// 				mongoose会自动将大写名词的字符串生成小写复数的集合名称
//				例如:这里的User最终会变为users集合名称
// 第二个参数: 架构Schema
// 返回值: 模型构造函数
var User = mongoose.model('User',userSchema)// 4.当我们有了模型构造函数之后,就可以使用这个构造函数对users集合中的数据进行操作
2. 增加数据
// 1.导包
const mongoose = require('mongoose')const Schema = mongoose.Schema// 2.连接数据库
// 这里指定连接的数据库mydb可以不需要存在,当你插入第一条数据之后就会帮你自动创建这个数据库
mongoose.connect('mongodb://localhost/mydb')// 3.设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
const userSchema = new Schema({username: {type: String,require: true // 必须有该属性},password: {type: String,require: true},email: {type: String}
});// 3.将文档结构发布为模型
// mongoose.model() 就是用来将一个架构发布为 model
// 第一个参数: 传入一个大写名词单数字符串,用来表示你的数据库名称
// 				mongoose会自动将大写名词的字符串生成小写复数的集合名称
//				例如:这里的User最终会变为users集合名称
// 第二个参数: 架构Schema
// 返回值: 模型构造函数
var User = mongoose.model('User',userSchema)// 4.当我们有了模型构造函数之后,就可以使用这个构造函数对users集合中的数据进行操作
var admin = new User({username: 'admin',password: '123456',email: 'admin@admin.com'
})admin.save(function(err, ret) {if(err) {console.log('保存失败')} else {console.log('保存成功!')console.log(ret)}
})

在这里插入图片描述

3. 查询数据
// 1.导包
const mongoose = require('mongoose')const Schema = mongoose.Schema// 2.连接数据库
// 这里指定连接的数据库mydb可以不需要存在,当你插入第一条数据之后就会帮你自动创建这个数据库
mongoose.connect('mongodb://localhost/mydb')// 3.设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
const userSchema = new Schema({username: {type: String,require: true // 必须有该属性},password: {type: String,require: true},email: {type: String}
});// 3.将文档结构发布为模型
// mongoose.model() 就是用来将一个架构发布为 model
// 第一个参数: 传入一个大写名词单数字符串,用来表示你的数据库名称
// 				mongoose会自动将大写名词的字符串生成小写复数的集合名称
//				例如:这里的User最终会变为users集合名称
// 第二个参数: 架构Schema
// 返回值: 模型构造函数
var User = mongoose.model('User', userSchema)// 4.当我们有了模型构造函数之后,就可以使用这个构造函数对users集合中的数据进行操作
// 新增数据操作
/* var admin = new User({username: 'zepzep',password: '000000',email: 'zep@zep.com'
})admin.save(function(err, ret) {if(err) {console.log('保存失败')} else {console.log('保存成功!')console.log(ret)}
}) */// 查询数据操作
// 1.查询所有数据
/* User.find(function(err, ret) {if(err) {console.log('查询失败')} else {console.log(ret)}
}) */// 2.按条件查询数据,返回值为数组
/* User.find({username: 'zepzep'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
})*/// 3.按条件查询数据,返回值为查找到的匹配的第一个的对象
User.findOne({username: 'zepzep',password: '111'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
})

在这里插入图片描述

4. 删除数据
// 1.导包
const mongoose = require('mongoose')const Schema = mongoose.Schema// 2.连接数据库
// 这里指定连接的数据库mydb可以不需要存在,当你插入第一条数据之后就会帮你自动创建这个数据库
mongoose.connect('mongodb://localhost/mydb')// 3.设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
const userSchema = new Schema({username: {type: String,require: true // 必须有该属性},password: {type: String,require: true},email: {type: String}
});// 3.将文档结构发布为模型
// mongoose.model() 就是用来将一个架构发布为 model
// 第一个参数: 传入一个大写名词单数字符串,用来表示你的数据库名称
// 				mongoose会自动将大写名词的字符串生成小写复数的集合名称
//				例如:这里的User最终会变为users集合名称
// 第二个参数: 架构Schema
// 返回值: 模型构造函数
var User = mongoose.model('User', userSchema)// 4.当我们有了模型构造函数之后,就可以使用这个构造函数对users集合中的数据进行操作
// 新增数据操作
/* var admin = new User({username: 'zepzep',password: '000000',email: 'zep@zep.com'
})admin.save(function(err, ret) {if(err) {console.log('保存失败')} else {console.log('保存成功!')console.log(ret)}
}) */// 查询数据操作
// 1.查询所有数据
/* User.find(function(err, ret) {if(err) {console.log('查询失败')} else {console.log(ret)}
}) */// 2.按条件查询数据,返回值为数组
/* User.find({username: 'zepzep'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
})*/// 3.按条件查询数据,返回值为查找到的匹配的第一个的对象
/* User.findOne({username: 'zepzep',password: '111'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
}) */// 删除数据操作
User.remove({username: 'zepzep'
}, function(err, ret) {if(err) {console.log('删除失败')} else {console.log('删除成功!')console.log(ret)}
})

在这里插入图片描述

5.更新数据
// 1.导包
const mongoose = require('mongoose')const Schema = mongoose.Schema// 2.连接数据库
// 这里指定连接的数据库mydb可以不需要存在,当你插入第一条数据之后就会帮你自动创建这个数据库
mongoose.connect('mongodb://localhost/mydb')// 3.设计集合结构(表结构)
// 字段名称就是表结构中的属性名称
// 值
const userSchema = new Schema({username: {type: String,require: true // 必须有该属性},password: {type: String,require: true},email: {type: String}
});// 3.将文档结构发布为模型
// mongoose.model() 就是用来将一个架构发布为 model
// 第一个参数: 传入一个大写名词单数字符串,用来表示你的数据库名称
// 				mongoose会自动将大写名词的字符串生成小写复数的集合名称
//				例如:这里的User最终会变为users集合名称
// 第二个参数: 架构Schema
// 返回值: 模型构造函数
var User = mongoose.model('User', userSchema)// 4.当我们有了模型构造函数之后,就可以使用这个构造函数对users集合中的数据进行操作
// 新增数据操作
/* var admin = new User({username: 'zepzep',password: '000000',email: 'zep@zep.com'
})admin.save(function(err, ret) {if(err) {console.log('保存失败')} else {console.log('保存成功!')console.log(ret)}
}) */// 查询数据操作
// 1.查询所有数据
/* User.find(function(err, ret) {if(err) {console.log('查询失败')} else {console.log(ret)}
}) */// 2.按条件查询数据,返回值为数组
/* User.find({username: 'zepzep'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
})*/// 3.按条件查询数据,返回值为查找到的匹配的第一个的对象
/* User.findOne({username: 'zepzep',password: '111'
}, function(err, ret) {if (err) {console.log('查询失败')} else {console.log(ret)}
}) */// 删除数据操作
/* User.remove({username: 'zepzep'
}, function(err, ret) {if(err) {console.log('删除失败')} else {console.log('删除成功!')console.log(ret)}
}) */// 更新数据操作
User.findByIdAndUpdate('6062cff077b662686460e549', {password: '123'
}, function(err, ret) {if(err) {console.log('更新失败')} else {console.log('更新成功!')console.log(ret)}
})

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pip install时发生raise ReadTimeoutError(self._pool, None, 'Read timed out.')的解决方案

问题描述 在windows下,python在安装一些包的时候,常常会碰到time out的情况,如下图所示。不管再重试几次都是如此,这时候该怎么办呢? 解决方案 方案一:更换安装源(推荐使用豆瓣源&#xff09…

使用Node 操作MySQL数据库

1. 安装 官方文档:https://www.npmjs.com/package/mysql npm install --save mysql2.代码演示 var mysql require(mysql);// 1.创建连接 var connection mysql.createConnection({host : localhost,user : root,password : root,database : my_db …

利用随机森林对特征重要性进行评估

文章目录1 前言2 随机森林(RF)简介3 特征重要性评估4 举个例子5 参考文献1 前言 随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,更令人惊奇的是它在分类和回归上表现出了十…

Promise学习——解决回调地狱问题

Promise promise 容器概念: callback hell(回调地狱): 文件的读取无法判断执行顺序(文件的执行顺序是依据文件的大小来决定的)(异步api无法保证文件的执行顺序) var fs require(fs);fs.readFile(./data/a.text,ut…

基于哈希表的索引堆变形(Hackerrank: QHEAP1)

问题来源 此题来自于Hackerrank中的QHEAP1问题,考查了对堆结构的充分理解。成功完成此题,对最大堆或者最小堆的基本操作实现就没什么太大问题了。 问题简述 实现一个最小堆,对3种类型的输入能给出正确的操作: “1 v” - 表示往…

Node 中的path模块

参考文档:https://nodejs.org/docs/latest-v13.x/api/path.html path模块中的常用API: path.basename:获取路径的文件名,默认包含扩展名path.dirname:获取路径中的目录部分path.extname:获取一个路径中的扩…

Node中的fs模块

1.fs.stat检测是文件还是目录 2.fs.mkdir创建目录 3.fs.writeFile创建写入文件 4.fs.appendFile追加文件 5.fs.readFile 读取文件 6.fs.readdir读取目录 7.fs.rename重命名 8.fs.rmdir删除目录 9.fs.unlink 删除文件 fs.stat 检测是文件还是目录 const fs require(fs)fs.stat…

主成分分析(PCA)和基于核函数的主成分分析(KPCA)入门

文章目录1 前言2 PCA的原理2.1 什么是投影2.2 投影后的方差2.3 转化为求特征值的问题2.4 符号的表示3 KPCA的原理4 PCA和KPCA在Python中的使用4.1 PCA的使用4.2 KPCA的使用5 参考文献1 前言 主成分分析是在做特征筛选时的重要手段,这个方法在大部分的书中都只是介绍…

算法分类整理+模板①:矩阵快速幂

一直有一个想法,感觉自己很多基础算法不是很扎实,想要找个机会写一些算法的整理,顺便自己总结一些实用的模板。 最近偶然在训练赛中连续做了2道思维矩阵快速幂的题目,碰巧有时间,就以矩阵快速幂作为这个系列博客的开始…

爬虫小记:利用cookies跳过登陆验证码

前言 在爬取某些网页时,登陆界面时经常遇到的一个坎,而现在大多数的网站在登陆时都会要求用户填写验证码。当然,我们可以设计一套机器学习的算法去破解验证码,然而,验证码的形式多种多样,稍微变一下&#…

Nodejs 中的包、npm 、第三方模块、 package.json 以及 cnpm

一、包与 NPM 包Nodejs 中除了它自己提供的核心模块外,我们可以自定义模块,也可以使用第三方的 模块。Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行 统一管理。 完全符合 CommonJs 规范的包目录一般包含如下…

神经网络中BP(back propagation)到底在干些什么

前言 想要理解神经网络的工作原理,反向传播(BP)是必须搞懂的东西。BP其实并不难理解,说白了就是用链式法则(chain rule)算算算。本文试图以某个神经网络为例,尽可能直观,详细,明了地说明反向传播的整个过程。 正向传…

Nodejs 新特性 async await 的使用 以及使用 async await 处理异步

1. let 和 var 2. const定义常量 3. 模板字符串 4. 属性简写 5. 方法简写 6. 箭头函数 7. 回调函数 7. Promise 8. async 和 await

leetcode 高薪_LeetCode 第 125 号问题:验证回文串

本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一。个人网站:https://www.cxyxiaowu.com题目来源于 LeetCode 第 125 号问题:验证回文串。这道题目是 初级程序员 在面试的时候经常遇到的一道算法题,而且面试官喜欢…

从拉格朗日乘子法到SVM

前言 本文主要是讲了如何构建SVM的模型,并利用KKT条件构造其对偶型,从而求解问题,并讲述了SVM的硬间隔,软间隔和核函数三个境界。主要参考了周志华的《机器学习》,并在其中补充了自己的想法。由于内容较多&#xff0c…

nodejs 创建一个静态资源服务器 +路由

0、补充 1、Node.js 创建的第一个应用 1、引入 http 模块 var http require("http"); 2、创建服务器 接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 3000 端口。 函数通过 request, response 参数来接收和响应数据。 co…

python输出字体的大小_Python密码学编程:文件的加密与解密

在之前的章节中,编写的程序只能操作较少的信息,这些信息往往是以字符串的形式直接写在代码中的。但本章中的程序可以对整个文件进行加密和解密,文件的大小可以包括成千上万个字符。本章要点open()方法。读、写文件。write()、close()及read()…

电脑k歌软件_金麦客专业k歌app下载|金麦客专业k歌软件 手机安卓版v1.1.5.0 下载...

金麦客专业k歌app能够让用户通过手机直接连接电视,从而在安卓端实现金麦客点歌的目的,平台包含上万高清mv资源,让用户在歌唱时能够更好的代入氛围中,并且还能通过网络直接搜歌,从而在线下载播放,用户在演唱…

Nodejs ejs模板引擎

官方网站:https://www.npmjs.com/package/ejs 我们学的 EJS 是后台模板,可以把我们数据库和文件读取的数据显示到 Html 页面上面。它 是一个第三方模块,需要通过 npm 安装 npm install ejs –save 或者 cnpm install ejs --saveNodejs 中使用…

linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!

嵌入式设备在电路中交换信息的时候必须通过共享一个通用的协议。现在嵌入式系统中已经定义了数百种通信协议来实现数据交换,一般来说可以将其分为两类:并行或串行。并行传输数据是指同时传输多个数据位,它们通常需要数据线和时钟线配合工作&a…