Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具。Mongoose
是 NodeJS 的驱动,不能作为其他语言的驱动。
安装
npm install mongoose --save
连接数据库
//引入mongoose
const Mongoose = require('mongoose')
//使用mongoose链接mongoDB数据库
Mongoose.connect("mongodb://localhost:27017/test",{
useNewUrlParser:true
},function(err){
if(err){
console.log(err)
return
}
console.log("已成功连接数据库!")
})
1.若当前数据库无权限验证则直接链接;
2.若有权限验证那么第一个参数为:"mongodb://用户名:密码@数据库地址/数据库名称"
3.其中connect()方法有三个参数:(url,options,cb)具体参考API
*4.优化:当然其实url,用户名,密码这些可以写作一个配置文件,到时候来读取应该要方便些!
定义Schema
1.数据库中的 Schema,为数据库对象的集合。schema 是 mongoose 里会用到的一种数据模式,可以理解为表结构的定义;每个 schema 会映射到 mongodb 中的一个 collection,它不具备操作数据库的能力
- Schema里面的对象和数据库表里面的字段需要一一对应
//schema接收一个对象,里面的参数为数据库中集合(表)的字段
const UserSchema = mongoose.Schema({
name:String, //name:'string'
age:Number,
sex:String
})
- mongoose 提供的预定义模式修饰符,可以对我们增加的数据进行一些格式化
//其中每个字段值可以为一个对象,包含对该字段的操作及说明
const UserSchema = mongoose.Schema({
name:{
type:String, //字段类型
trim:true //表示入库前对该字段进行trim()除空格,类似的还有lowercase、uppercase
},
age:{
type:Number,
default:0 //该字段的默认值
},
sex:{
type:String,
set(value){ //Setters 自定义修饰符
return value=="0"?"男":"女"
}
}
})
- mongoose索引
索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更
快
const UserSchema = mongoose.Schema({
name:{
type:String, //字段类型
unique:true // **设置该字段唯一索引
},
age:{
type:Number,
index:true //普通索引
}
})
- Schema数据校验
required : 表示这个数据必须传入
max: 用于 Number 类型数据,最大值
min: 用于 Number 类型数据,最小值
enum:枚举类型,要求数据必须满足枚举值 enum: ['0', '1', '2']
match:增加的数据必须符合 match(正则)的规则
maxlength:最大值
minlength:最小值
validate:function(){}:自定义验证
const UserSchema = mongoose.Schema({
name:{
type:String, //字段类型
},
age:{
type:Number,
maxlength:60, //限制年龄这个字段在 18~60之间
minlength:18
},
sex:{
type:'string',
validate:function(sex){ //自定义的验证器,如果通过验证返回 true,没有通过则返回 false
return sex==='女'?true:false
}
}
})
生成Model(数据模型)
根据集合(表)字段 ——》 定义Schema ——》生成Model ——》操作数据库
const UserModel = mongoose.model("User",UserSchema,"user")
参数一:model名称(首字母大写)
参数二:定义的Schema
参数三:集合(表)名称
- 增加操作(其余方法参考API)
//生成Model
const UserModel = Mongoose.model("User",UserSchema,"user")
//增加(实例化模型)
let add = new UserModel({
name:'caristop3',
age:24,
sex:'男'
})
add.save(function(err,docs){
if(err){
console.log('保存出错:'+err)
return
}
console.log(docs)
})
save()方法有两个参数一个options,一个cb 具体参考API
- 修改操作(其余方法参考API)
//生成Model
const UserModel = Mongoose.model("User",UserSchema,"user")
//2.修改
UserModel.updateOne({"name":"caristop3"},{age:40},function(err,docs){
if(err){
console.log('更新出错:'+err)
return
}
console.log(docs)
})
- 删除操作(其余方法参考API)
UserModel.deleteOne({ name: "caristop3" }, function(err, docs) {
if (err) {
console.log("更新出错:" + err);
return;
}
console.log(docs);
});
- 查询操作(其余方法参考API)
//生成Model
const UserModel = Mongoose.model("User", UserSchema, "user");
//4.查询
UserModel.find({}, function(err, docs) {
if (err) {
console.log("查询出错:" + err);
return;
}
console.log(docs);
});
管道操作(aggregate)
- 常用管道操作符
$project:增加、删除、重命名字段 (SELECT)
$match:条件匹配。只满足条件的文档才能进入下一阶段 (WHERE)
$limit:限制结果的数量 (LIMIT)
$skip:跳过文档的数量 ()
$sort:条件排序 (ORDER BY)
$group:条件组合结果 统计 (GROUP BY)
$lookup:$lookup 操作符 用以引入其它集合的数据 (表关联查询) (join)
- 常用的管道表达式操作符
$addToSet 将文档指定字段的值去重
$max 文档指定字段的最大值
$min 文档指定字段的最小值
$sum 文档指定字段求和
$avg 文档指定字段求平均
$lg 大于给定值
$lt 小于给定值
$eq 等于给定值
- $project
UserModel.aggregate([{
$project:{
name:1 //只抽name字段
}
}], function(err, docs) {
if (err) {
console.log("查询出错:" + err);
return;
}
console.log(docs);
});
- $match
UserModel.aggregate(
[
{
$project: { //抽name,age字段
name: 1,
age: 1
}
},
{
$match: {
age: { $lt: 18 } //条件是年龄小于18
}
}
],
function(err, docs) {
if (err) {
console.log("查询出错:" + err);
return;
}
console.log(docs);
}
);
4. $group
5. $sort
6. $limit
7. $skip
UserModel.aggregate(
[
{
$project: {
name: 1,
age: 1
}
},
{
$match: {
age: { $gt: 18 }
}
},
{
$sort: {
age: -1 //倒序
}
},
{
$limit:2 //只抽2条
},
{
$skip:1 //1到最后
}
],
function(err, docs) {
if (err) {
console.log("查询出错:" + err);
return;
}
console.log(docs);
}
);
- $lookup
两表关联:
UserModel.aggregate(
[
$lookup:{
from:"关联的表",
localField:"关联字段",
foreignField:"外键关联字段"
as:"形成指定字段"
}
]
)
三表关联(多个$lookup):
UserModel.aggregate(
[
$lookup:{
from:"关联的表",
localField:"关联字段",
foreignField:"外键关联字段"
as:"形成指定字段"
},
$lookup:{
from:"关联的表",
localField:"关联字段",
foreignField:"外键关联字段"
as:"形成指定字段"
}
]
)
- populate(关联查询)
需要在Schema定义时指定ref:关联model的名称
Schema({
name:{
type:String,
ref:'所想关联表的model名称'
}
})
UserModel.find({}).populate("包含ref的那个字段(name)").exec(function(err,docs){})
数据库导入导出
//导出
mongodump -h "数据库地址" -d "导出数据库名称" -o "指定导出文件的位置"
//导入
mongorestore -h "数据库地址" -d "导入数据库名称" "导入文件的路径"