mongoDB的安装和使用mongoose
本文主要介绍mongoDB的安装启动以及使用mongoose实现基本的增删改查
数据库
什么是数据库?相信看到我这篇文章的读者不会有这样的疑问了吧。数据库就是按照数据结构来组织、存储和管理数据的仓库。而常见的数据库可以分为两大类,分别是关系型数据库和非关系型数据库,而这两者的代表无疑就是MySql和MongoDB了,下面我列出了这两种数据库的概念对比:
MySql | MongoDB |
---|---|
关系型数据库 | 非关系型数据库 |
数据存储使用二维表 | 数据存储采用json格式 |
表结构相对固定的 | 数据结构更加灵活 |
database(数据库) | database(数据库) |
table(表) | collection(集合) |
row(行) | document(文档) |
col(列) | filed(字段) |
使用sql语句进行增删改查 | api直接完成增删改查 |
1 | // mongoDB的一个collection里数据大概可以是这样的json结构 |
安装和启动
下载mongoDB服务:https://www.mongodb.org/dl/win32/ 选择3.1.2的版本是最容易安装的,当然如果最自己的电脑环境有足够的自信也可以选择较新版本
安装
注意这里要选择custom,其他每步都直接下一步安装即可
新建一个空目录,位置不要太深,比如: C:\db , 这个目录是用来存放数据文件的
运行mongoDB服务:进入mongoDB安装路径下的bin目录里,比如:C:\Program Files\MongoDB\Server\4.0\bin(这是作者的mongoDB服务安装路径,读者要自行查找并进入,默认目录一般是类似这样的),打开命令行工具,git bash 或者powershell那个能用用哪个(此处不必纠结,很有可能环境原因会导致powershell或者cmd能用但是git bash不能用)
执行
mongod --dbpath c://db
(这里的C://db就是我们在第三步新建的空目录,需要替换成你自己的)。只要没有出现报错,如下图所示说明服务启动成功,默认端口号就是27017,这个窗口不要关闭!!!我们可以使用可视化工具对数据库进行查看,如:robo3t,navicat for mongoDB
使用mongoose
mongoose介绍
我们操作数据库时可以使用mongoDB的api来做,但是这些api使用起来可能并没有那么友好,因此给大家介绍一个包mongoose
,官网 https://mongoosejs.com/docs/index.html 对mongoose的定义如下:
elegant mongodb object modeling for node.js
Mongoose是在node.js环境下对mongodb进行便捷操作的对象模型
这里的着落点在对象模型,什么是对象模型?以前我们学过 BOM(浏览器对象模型)和 DOM(文档对象模型)。BOM的顶级对象是window
,这个对象里包含了各种操作浏览器的子对象;DOM的顶级对象是document
,这个对象里也有各种属性和对象可以操作文档,那么我们的mongoose是mongoDB对象模型,所以同理可得,mongoose也有一个顶级对象,这个对象就是在这个包里定义的,我们可以导入他用来操作mongoDB,比mongoDB本身的api更好用,因为他是二次封装过的。
mongoose使用步骤
以本地localhost的admin数据库里的users这个collection为例来说明使用步骤
创建一个空的目录,进入此目录,使用命令
npm init -y
初始化项目,然后执行npm i mongoose
安装mongoose依赖包引入模块,连接数据库
1
2
3
4
5
6
7
8
9
10
11// 引入包
const mongoose = require('mongoose')
// 连接本地的admin数据库
mongoose.connect('mongodb://localhost/admin', {useNewUrlParser: true})
const db = mongoose.connection
db.on('error', console.error.bind(console, 'connection error:'))
db.once('open', function() {
// 这里就代表成功连接了
console.log("we're connected!")
})得到一个schema,schema是定义数据结构,讲本身非关系型数据库做一个结构化处理,因为虽然非关系型数据库结构可以更加灵活,但是在实际项目中这并不一定是优点,很多时候我们还是希望数据更加整齐,而不是松散
1
2
3
4
5
6// new一个schema:把一个本身非结构化的数据变成结构化
const userSchema = new mongoose.Schema({
name: String,
password: String,
age: Number
})基于schema得到一个model,model是把schema跟collection进行关联,
1
2
3// 根据schema得到一个model,这个model是一个class
// 这个方法的第一个参数就是collection的名称,这个名称必须要加s,这里不加的话也会默认帮我们加上,所以自己的事情自己做,加上他吧
const User = mongoose.model('users', userSchema)操作数据库
新增一条:把document数据作为参数传递,得到一个model的实例,这个实例调用save方法就可以存入数据库了
1
2
3
4
5
6
7
8// new一个model
var dary = new User({ name: 'dary', password: '123456', age: 18 })
// 把一条document存入collection里,save是model实例的方法,所以是dary来调用
dary.save(function (err, user) {
if (err) return console.error(err);
console.log(user)
})查询数据:直接调用model的find方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35// 查询所有数据
User.find((err, docs) => {
if (err) return console.error(err)
console.log(docs)
})
// 查询name为dary的数据
Position.find({ name: 'dary' }, (err, docs) => {
if (err) return console.error(err)
console.log(docs)
})
// 查询salsary>=20的数据,$gt大于;$lt小于;$lte小于等于
User.find({ age: {$gte: 20 } }, (err, docs) => {
if (err) return console.error(err)
console.log(docs)
})
// 查询条件支持正则,查询name以字母d开头的数据
User.find({ name: /^d/ }, (err, docs) => {
if (err) return console.error(err)
console.log(docs)
})
// 查询name里包含字母d的数据的age和gender
User.find({ title: /d/ }, 'age gender', (err, docs) => {
if (err) return console.error(err)
console.log(docs)
})
// 查询name里包含字母d的数据skip跳过一条limit只查询两条,意味着这里只能拿到第二条和第三条数据
User.find({ name: /d/ }, null, { skip: 1, limit: 2 }, (err, docs) => {
if (err) return console.error(err)
console.log(docs)
})更新:update、updateOne(更新一条)和updateMany(更新多条),三个方法用法一致,结果不同,以其中一个为例
1
2
3
4
5
6
7
8
9// 找到第一个满足条件的并更新:把年龄小于20的密码改为666
User.update({ age: { $lt: 20 } }, { password: '666' }, (err, obj) => {
if (err) return console.error(err)
// obj里有三个属性
// n: 条件匹配到的数据条数
// ok: 1代表语句执行成功
// nModified: 更新的数量
console.log(obj)
})删除:deleteOne和deleteMany,删除一条和删除多条
1
2
3
4
5
6
7
8
9// 将年龄为40的数据删除掉
User.deleteOne({ age: 40 }, (err, obj) => {
if (err) return console.error(err)
// obj里有三个属性
// n:条件匹配到的数据条数
// ok: 1代表语句执行成功
// deletedCount: 被删除的数量
console.log(obj)
})
代码不是万能的,但不写代码是万万不能的
Dary记
-
更多干货,尽在公众号
转载请注明来源,文末有原始链接。欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 dary1112@foxmail.com
创作不易,您的打赏是我更新的动力
-
支付宝
-
微信
文章标题:mongoDB的安装和使用mongoose
文章字数:1.7k
本文作者:Dary
发布时间:2020-03-03, 00:07:00
最后更新:2020-03-14, 11:06:44
原始链接:http://www.xiongdalin.com/2020/03/03/mongodb01/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。
Built By Dary