Mongodb 以及 node.js中使用mongoose操作数据库
Mongodb 以及 node.js中使用mongoose操作数据库
1、lowdb
一个简陋的数据库第三方库,使用JSON文件来保存数据,进行增删改查。
在没有数据库或者数据量小到不使用数据库的时候可以使用,了解即可。
2、Mongodb是什么?
MongoDB是一个基于分布式文件存储的数据库。
相比于纯文件管理数据,数据库管理数据有如下的特点:
- 速度更快
- 扩展性更强
- 安全性更强
为什么选择Mongodb,因为它的操作语法与JS类似,容易上手,学习成本低。
3、Mongodb核心概念
- 数据库(database)数据库就是一个数据仓库,数据库服务下可以创建很多数据库,数据库中可以存放很多集合。
- 集合(collecttion)集合类似于JS中的数组,在集合中可以存放很多文档。
- 文档(document)文档是数据库中的最小单位,类似JS中的对象。
4、Mongodb的下载与使用
下载地址:https://www.mongodb.com/try/download/community
建议选择zip类型,通用性更强。
配置步骤如下:
- 将压缩包移动到C:\Program Files下,然后解压
- 创建C:\data\db目录,mongodb会将数据存在这里
- 以mongodb中的bin目录作为工作目录,启动命令行。
- 运行mongod.exe
看到waiting for connections就表明服务启动成功。
客户端程序
- 运行mongo.exe
注意:
- 为了后续方便使用mongod命令,可以将bin目录配置到环境变量path中
- 千万不要选中服务端窗口的内容,选中会停止服务,可以敲回车取消选中
5、数据库与集合命令
5.1、数据库命令
- 1、显示所有数据库
- show dbs
- 2、切换到指定数据库
- use 数据库名
- 3、显示当前所在的数据库
- db
- 4、删除当前数据库
- use 库名
- db.dropDatabase()
5.2、集合命令
- 1、创建集合
- db.createCollection('集合名称')
- 2、显示当前数据库中的所有集合
- show collections
- 3、删除某个集合
- db.集合名.drop()
- 4、重命名集合
- db.集合名.renameCollection('newName')
5.3、文档命令
- 1、插入文档
- db.集合名.insert(文档对象)
- 2、查询文档
- db.集合名.find({age: 20}) // 找年龄是20的文档,find不传参数,查询全部文档
- 3、更新文档
- db.集合名.update(查询条件,新的文档) // 不用$set,会替换掉整个文档
- db.集合名.update({name: '张三'}, {$set:{age:19}}) // 如果用$set,只修改age
- 4、删除文档
- db.集合名.remove(查询条件)
6、Mongoose
Mongoose是一个对象文档模型库。
方便我们使用代码去操作mongodb数据库。
npm i mongoose@6
// 导入mongoose
const mongoose = require('mongoose');
// 连接mongoose服务
mongoose.connect('mongodb://127.0.0.1:27017/bilibili'); // 如果bilibili数据库不存在会自动创建
// 设置回调
mongoose.connection.on('open', () => {
console.log('连接成功');
}); // 连接成功回调
mongoose.connection.on('error', () => {
console.log('连接失败');
}); // 连接失败回调
mongoose.connection.on('close', () => {
console.log('连接关闭');
}); // 连接关闭回调
// 关闭mongodb的连接
setTimeout(() => {
mongoose.disconnect();
}, 3000);
6.1、插入文档
// 导入mongoose
const mongoose = require('mongoose');
// 连接mongoose服务
mongoose.connect('mongodb://127.0.0.1:27017/bilibili'); // 如果bilibili数据库不存在会自动创建
// 设置回调
mongoose.connection.on('open', () => {
// 创建文档的结构对象,设置集合中文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number
});
// 创建模型对象,对文档操作的封装对象
let BookModel = mongoose.model('book', BookSchema);
// 新增
// BookModel.create({
// name: '西游记',
// author: '吴承恩',
// price: 19.9
// }, (err,data) => {
// if (err) {
// console.log(err);
// return;
// }
// // 如果没出错,则输出插入后的文档对象
// console.log(data);
// });
// 新增多条
BookModel.insertMany([{
name: '西游记',
author: '吴承恩',
price: 19.9
},{
name: '西游记',
author: '吴承恩',
price: 19.9
},{
name: '西游记',
author: '吴承恩',
price: 19.9
}], (err,data) => {
if (err) {
console.log(err);
return;
}
// 如果没出错,则输出插入后的文档对象
console.log(data);
});
}); // 连接成功回调
mongoose.connection.on('error', () => {
console.log('连接失败');
}); // 连接失败回调
mongoose.connection.on('close', () => {
console.log('连接关闭');
}); // 连接关闭回调
6.2、字段类型
String:字符串
Number:数字
Boolean:布尔值
Array:数组
Date:日期
Buffer:Buffer对象
Mixed:任意类型,需要使用mongoose.Schema.Types.Mixed指定
ObjectId:对象ID,需要使用mongoose.Schema.Types.ObjectId指定
Decimal128:高精度数字,需要使用mongoose.Schema.Types.Decimal128指定
6.3、字段值验证
6.3.1、必填项
title: {
type: String,
required: true
}
6.3.2、默认值
author: {
type: String,
default: '匿名'
}
6.3.3、枚举值
sex: {
type: String,
enum: ['男', '女']
}
6.3.4、唯一值
username: {
type: String,
unique: true,
}
unique需要重建集合才有效果。永远不要相信用户的输入。
6.4、删除文档
// 导入mongoose
const mongoose = require('mongoose');
// 连接mongoose服务
mongoose.connect('mongodb://127.0.0.1:27017/bilibili'); // 如果bilibili数据库不存在会自动创建
// 设置回调
mongoose.connection.on('open', () => {
// 创建文档的结构对象,设置集合中文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number
});
// 创建模型对象,对文档操作的封装对象
let BookModel = mongoose.model('book', BookSchema);
// 删除一条
BookModel.deleteOne({_id: '6461be48670777b4e3f2bfcc'}, (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
});
// 批量删除
BookModel.deleteMany({is_hot: false}, (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
});
}); // 连接成功回调
mongoose.connection.on('error', () => {
console.log('连接失败');
}); // 连接失败回调
mongoose.connection.on('close', () => {
console.log('连接关闭');
}); // 连接关闭回调
6.5、更新文档
// 导入mongoose
const mongoose = require('mongoose');
// 连接mongoose服务
mongoose.connect('mongodb://127.0.0.1:27017/bilibili'); // 如果bilibili数据库不存在会自动创建
// 设置回调
mongoose.connection.on('open', () => {
// 创建文档的结构对象,设置集合中文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number
});
// 创建模型对象,对文档操作的封装对象
let BookModel = mongoose.model('book', BookSchema);
// 更新一条
// BookModel.updateOne({name: '西游记'}, {price: 9.9}, (err,data) => {
// // 判断err
// if (err) {
// console.log('更新失败');
// return;
// }
// console.log(data);
// });
// 批量更新
BookModel.updateMany({name: '西游记'}, {price: 9.9}, (err,data) => {
// 判断err
if (err) {
console.log('更新失败');
return;
}
console.log(data);
});
}); // 连接成功回调
mongoose.connection.on('error', () => {
console.log('连接失败');
}); // 连接失败回调
mongoose.connection.on('close', () => {
console.log('连接关闭');
}); // 连接关闭回调
6.6、查询文档
// 导入mongoose
const mongoose = require('mongoose');
// 连接mongoose服务
mongoose.connect('mongodb://127.0.0.1:27017/bilibili'); // 如果bilibili数据库不存在会自动创建
// 设置回调
mongoose.connection.on('open', () => {
// 创建文档的结构对象,设置集合中文档的属性以及属性值的类型
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number
});
// 创建模型对象,对文档操作的封装对象
let BookModel = mongoose.model('book', BookSchema);
// 查询单条
BookModel.findOne({name: '西游记'}, (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
});
// 根据ID获取文档
BookModel.findById('6461c222f73d78ca0b9fd980', (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
});
// 批量获取(有条件)
BookModel.find({author: '吴承恩'}, (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
});
// 无条件,读取所有
BookModel.find((err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
});
}); // 连接成功回调
mongoose.connection.on('error', () => {
console.log('连接失败');
}); // 连接失败回调
mongoose.connection.on('close', () => {
console.log('连接关闭');
}); // 连接关闭回调
6.7、条件控制
6.7.1、运算符
在mongodb中,不能用><等运算符,要使用替代符号:
- >,$gt
- <,$lt
- >=,$gte
- <\,$lte
- !==,$ne
db.students.find({id:{$gt:3}}); id号比3大的所有文档
6.7.2、逻辑运算
$or逻辑或的情况
db.students.find({$or:[{age:18}, {age:24}]});
$and逻辑与的情况
db.students.find({$and:[{age:18}, {age:24}]});
6.7.3、正则匹配
条件中可以直接使用JS的正则语法,可以进行模糊查询:
db.students.find({name:/imissyou/});
6.8、mongoose个性化读取
6.7.1、字段筛选
SongModel.find().select({_id:0, title:1}).exec(function(err, data) {
if (err) throw err;
console.log(data);
mongoose.connection.close();
})
6.7.2、数据排序
SongModel.find().sort({hot:1}).exec(function(err, data) {
if (err) throw err;
console.log(data);
mongoose.connection.close();
})
6.7.3、数据截取
// skip跳过,limit限定
SongModel.find().skip(10).limit(10).exec(function(err, data) {
if (err) throw err;
console.log(data);
mongoose.connection.close();
})
7、mongodb图形化管理工具
7.1、robo3t
去github上下载,免费
7.2、Navicat
收费