介绍
Mongoose 是一个对象文档模型库,官网 http://www.mongoosejs.net/
作用
方便使用代码操作 mongodb 数据库
使用流程
// 导入mongoose
const mongoose = require("mongoose");
// 连接 mongodb
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 设置回调
mongoose.connection.on("open", () => {
// 设置连接成功的回调
console.log("连接成功");
});
mongoose.connection.on("error", () => {
// 设置连接错误的回调
console.log("连接失败");
});
mongoose.connection.on("close", () => {
// 设置连接关闭的回调
console.log("连接关闭");
});
// 关闭连接
setTimeout(() => {
mongoose.disconnect();
}, 2000);
// 导入mongoose
const mongoose = require("mongoose");
mongoose.set('strictQuery', false);
// 连接 mongodb
mongoose.connect('mongodb://127.0.0.1:27017/bilibili');
// 设置回调
mongoose.connection.once("open", () => {
// 创建文档的结构对象
let BookSchema = new mongoose.Schema({
name: String,
author: String,
price: Number
});
// 创建模型对象
let BookModel = mongoose.model('books', BookSchema);
// 新增
BookModel.create({
name: "西游记",
author: "吴承恩",
price: 19.9
}, (err,data)=>{
if (err) {
console.log(err);
return;
}
console.log(data);
mongoose.disconnect();
});
});
mongoose.connection.on("error", () => {
// 设置连接错误的回调
console.log("连接失败");
});
mongoose.connection.on("close", () => {
// 设置连接关闭的回调
console.log("连接关闭");
});
文档结构可选的常用字段类型列表
类型 | 描述 |
---|---|
String | 字符串 |
Number | 数字 |
Boolean | 布尔值 |
Array | 数组,也可以使用[] 来标识 |
Date | 日期 |
Buffer | Buffer 对象 |
Mixed | 任意类型,需要使用 mongoose.Schema.Types.Mixed 指定 |
ObjectId | 对象 ID,需要使用 mongoose.Schema.Types.ObjectId 指定 |
Decimal128 | 高精度数字,需要使用 mongoose.Schema.Types.Decimal128 指定 |
Mongoose 有一些内建验证器,可以对字段值进行验证
必填项
title: {
type: String,
required: true // 设置必填项
},
默认值
author: {
type: String,
default: '匿名' //默认值
},
枚举值
gender: {
type: String,
enum: ['男','女'] //设置的值必须是数组中的
},
唯一值 (主键)
username: {
type: String,
unique: true
},
unique 需要
重建集合
才能有效果
数据库的基本操作包括四个,增加(create),删除(delete),修改(update),查(read)
插入一条
SongModel.create({
title:'给我一首歌的时间',
author: 'Jay'
}, function(err, data){
//错误
console.log(err);
//插入后的数据对象
console.log(data);
});
批量插入
PhoneModel.insertMany([
{
brand:'华为',
color:'灰色',
price:2399,
tags:['电量大','屏幕大','信号好']
},
{
brand:'小米',
color:'白色',
price:2099,
tags:['电量大','屏幕大','信号好']
}],(err,data)=>{
if(err) throw err;
console.log('写入成功');
mongoose.connection.close();
})
删除一条数据
BookModel.deleteOne({_id: "65c60c85df92ad81ab74d4a8"}, (err, data) => {
// 判断
if (err) {
console.log("删除失败~~");
return;
}
console.log(data);
});
批量删除
BookModel.deleteMany({is_hot: false}, (err, data) => {
if (err) {
console.log("删除失败~~");
return;
}
console.log(data);
});
更新一条
BookModel.updateOne({name: "红楼梦"}, {price: 9.9}, (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
});
批量更新
BookModel.updateMany({author: "余华"}, {is_hot: false}, (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
});
查询单条数据
BookModel.findOne({name: "狂飙"}, (err, data) => {
if (err) {
console.log(err);
}
console.log(data);
});
根据id查询
BookModel.findById({_id: "65c60c85df92ad81ab74d4b9"}, (err, data) => {
if (err) {
console.log(err);
}
console.log(data);
});
批量查询 (条件可以不添加则自动获取所有)
BookModel.find({author: "余华"}, (err, data) => {
if (err) {
console.log(err);
}
console.log(data);
});
在 mongodb 不能 > < >= <= !== 等运算符,需要使用替代符号
> 使用 $gt
< 使用 $lt
>= 使用 $gte
<= 使用 $lte
!== 使用 $ne
db.students.find({id: {$gt: 3}}); id号比3大的所有的记录
$or
逻辑或的情况
db.students.find({$or: [{age:18},{age:24}]});
$and
逻辑与的情况
db.students.find({$and: [{age: {$lt:20}}, {age: {$gt: 15}}]});
条件中可以直接使用 JS 的正则语法,通过正则可以进行模糊查询
db.students.find({name:/刘/});
db.students.find({name: new RegExp('刘')});
//0:不要的字段
//1:要的字段
SongModel.find().select({_id:0,title:1}).exec(function(err,data){
if(err) throw err;
console.log(data);
mongoose.connection.close();
});
//sort 排序
//1:升序
//-1:倒序
SongModel.find().sort({hot:1}).exec(function(err,data){
if(err) throw err;
console.log(data);
mongoose.connection.close();
});
//skip 跳过 limit 限定
SongModel.find().skip(10).limit(10).exec(function(err,data){
if(err) throw err;
console.log(data);
mongoose.connection.close();
});