1.indexs.js
index.js 实现的功能是连接数据库
//index.js 实现的功能是连接数据库
// 1.引包
// 注意:按照后才能require使用
var mongoose = require('mongoose');
// 2.连接数据库
// 指定连接数据库后不需要存在,当你插入第一条数据库后会自动创建数据库
mongoose.connect('mongodb://localhost/yzh',{useNewUrlParser:true},function(err){
if(err){
console.log(err)
return;
}
console.log('数据库连接成功')
});
module.exports=mongoose;
user.js 表
const mongoose = require('./index')
//2.拿到Schema
var Schema= mongoose.Schema
//3.设计表结构
var userSchema =new Schema({
userName:{//姓名
type:String,
},
password:{
type:String,//密码
default:'123456'//默认123456
}
})
// 4.将文档结构发布为模型
// mongoose.model方法就是用来将一个架构发布为 model
// 第一个参数:传入一个大写名词单数字符串用来表示你的数据库的名称
// mongoose 会自动将大写名词的字符串生成 小写复数 的集合名称
// 例如 这里会变成users集合名称
// 第二个参数:架构
// 返回值:模型构造函数
// 第三个参数:映射那张表
//5.外部使用导出
module.exports= mongoose.model('UserN',userSchema)
news.js 新闻表
const mongoose = require('./index')
var Schema =mongoose.Schema
var newsSchema=new Schema({
title:{
type :String,
default:'新闻标题'
},
name:{
type:String,
default:'编辑人'
}
})
module.exports = mongoose.model('New',newsSchema)
mian.js 主 执行js
var UserModel=require('./model/user')
var NewsModel= require('./model/news')
//查询用户表
UserModel.find({}).then((data)=>{
console.log('查询成功'+data)
})
//添加一条新闻记录,有默认值
var News =new NewsModel({
title:"",
name:""
})
//执行保存
News.save()
//查询新闻表
NewsModel.find({}).then((data)=>{
console.log("查询成功"+data)
})
SchemaTypes
set 自定义修饰符 使用
var numberSchema = new Schema({
integerOnly: {
type: Number,
//取整数
set: v => Math.round(v),
}
});
var Number = mongoose.model('Number', numberSchema);
var doc = new Number();
doc.integerOnly = 2.001;
doc.integerOnly; // 2
var newsSchema=new Schema({
title:{
type :String,
default:'新闻标题'
},
name:{
type:String,
default:'编辑人',
//params 获取提交的 数据 name 的值 ,进行修改后保存,到数据库中
//如果 提交的 name 是空 就返回params
//如果 不是空,并且开头不是中国的 就加上 中国 在保存 ,可以做任何形式的处理
set(params){
if(!params){
return params
}
if(params.indexOf('中国')!=0 ){
return '中国'+params
}
return params
}
}
})
设置索引
//索引优化查询速度
//mongodb 每个表默认有个 _id 索引
var newsSchema=new Schema({
title:{
type :String,
default:'新闻标题',
//唯一索引
unique:true
},
name:{
type:String,
default:'编辑人',
//普通索引
index:true
}
})
自动生成 创建时间,修改时间
那如何才能在schema定义中让MongoDB自动生成和管理createTime和updateTime字段的值呢?答案是使用timestamps选项。有关timestamps选项的作用可以看官方文档的解释http://mongoosejs.com/docs/guide.html#timestamps
//mongodb 每个表默认有个 _id 索引
var newsSchema=new Schema({
title:{
type :String,
required: [true,'标题必须有']
},
name:{
type:String,
default:'编辑人',
}
},{timestamps:{createdAt:'createTime',updatedAt:'updateTime'}}
)
添加了高亮显示的部分。timestamps选项会在创建文档时自动生成createAt和updateAt两个字段,值都为系统当前时间。并且在更新文档时自动更新updateAt字段的值为系统当前时间。如果想自定义这两个字段的名称,则可以使用上述高亮部分的定义方法。如果使用默认的字段名,则使用下面的定义方法即可:
timestamps: true
在Mongoose中,定义数据库model schemas时使用timestamps选项可以给我们带来许多便利。在创建文档时不用在代码中去指定createTime字段的值,在更新文档时也不用去修改updateTime字段的值。
聚合管道 连表查询
var UserModel = require('./model/user')
//查询 用户表,关联新闻表,news
UserModel.aggregate([
{
$lookup:{
from :'news',//关联表(表名称)
localField:'UserModel_id',//UserModel 中的UserModel_id
foreignField:'UserModel_id',//NewsModel 中的UserModel_id
as:'data'//把查询到的数据放到 data中
}
},
{ // 条件age>90的
$match:{'age':{$gte:90}}
}
],function(err,docs){
})
查询 用户xaoyu,的信息,并 查询出 xiaoyu对应的 新闻id
第一种实现方式
var UserModel = require('./model/user')
var newsModel = require('./model/news')
UserModel.find({ '_id': '5fa3431db076e124389a4cf6' }).then((docs) => {
//深拷贝
var user_item =JSON.parse(JSON.stringify(docs))
let newId = user_item[0]._id
//根据查询的的id 再去查询 新闻表
newsModel.find({ 'userId': newId }).then((data) => {
user_item[0].userInfo = data[0]
console.log(data)
})
}).catch()
第二种实现方式
需要过去id所有要引入
var mongoose = require('mongoose');
var UserModel = require('./model/user')
var newsModel = require('./model/news')
var mongoose = require('mongoose');
//查询 用户xaoyu,的信息,并 查询出 xiaoyu对应的 新闻id
//第二种实现方式
UserModel.aggregate([
{
$lookup:{
from:'news',
localField:'UserModel_id',
foreignField:'UserModel_id',
as:'data'
}
},{$match:{_id: mongoose.Types.ObjectId('5fa3431db076e124389a4cf6')}}
]).then()