mongoose模块化开发连接mongdba

在这里插入图片描述

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()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mongoose 7是一个面向对象的MongoDB Node.js ODM库,可以帮助我们在Node.js应用程序中更方便地操作MongoDB数据库Mongoose 7支持模块化,可以将数据模型分解为多个文件,以便更好地组织代码。 下面是一个简单的示例,演示如何使用Mongoose 7模块化: 1. 安装Mongoose 7 ``` npm install mongoose@7 ``` 2. 创建一个db.js文件,用于连接MongoDB数据库 ```javascript const mongoose = require('mongoose'); const URL = 'mongodb://localhost:27017/mydb'; mongoose.connect(URL, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('MongoDB connected')) .catch(err => console.log('MongoDB connection error: ', err)); module.exports = mongoose; ``` 3. 创建一个user.js文件,定义用户数据模型 ```javascript const mongoose = require('./db'); const userSchema = new mongoose.Schema({ name: String, age: Number, email: String }); const User = mongoose.model('User', userSchema); module.exports = User; ``` 4. 在应用程序中使用User模型 ```javascript const User = require('./user'); // 创建新用户 const user = new User({ name: 'Alice', age: 25, email: 'alice@example.com' }); user.save() .then(() => console.log('User saved')) .catch(err => console.log('User save error: ', err)); // 查询所有用户 User.find() .then(users => console.log('All users: ', users)) .catch(err => console.log('Find users error: ', err)); ``` 这样,我们就可以将Mongoose 7的数据模型分解为多个文件,以便更好地组织代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yzhSWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值