mongoose(对象文档模型库)的使用

mongoose可以让我们用node操作mongoDB模块,对node原生的MongoDB模块优化封装,将里面的文档映射成了对象

好处:1.可以创建模式结构(schema)因为非关系数据库导致数据库没有类型限制。2.可以对模型中的对象进行验证3.数据 可以通过类型转化成对象模型4.中间件应用业务逻辑挂钩

说白了mongoose提供三个对象供我们使用,第一个schema模式对象,约束数据库的文档结构,限制类型比如name只能是字符串。model对象作为集合中所有的文档标识相当于MongoDB数据库中的集合。Document集合中的具体文档集合中的某一个具体文档。

创建顺序为schema -----model -----document.

1.mongoose库的使用

前面提到了数据库的操作我们都在可视化工具的shell输入命令,很不方便虽然有了提示,但是无法真正的和项目连接,这个库可以让我们在node环境也就是我们的后端代码中直接连接数据库并且进行增删改查,也就是json文件可以存到数据库的服务器中,而我们的后端代码相当于数据库的客户端。

1.连接数据库

lua 复制代码
/*
    1.下载安装mongoose
        npm install mongoose --save
    2.项目中引入
        const mongoose = require("mongoose")
    3.连接mongodb数据库
        const mongoose = require('mongoose');
        mongoose.connect('mongodb://数据库的协议//127.0.0.1:27017//数据库的ip地址端口号/test//数据库名称');
        //如果端口号是默认的27017 则可以省略不写
    4.监听MongoDB数据库的
        --在mongoose对象中有一个属性叫做connection 该对象表示的就是数据库连接
        通过监视该对象的状态可以监听数据库的连接与断开
        //数据库连接成功的事件
        mongoose.connect.once("open",function(){})
        //数据库断开连接的事件
        mongoose.connect.once("close",function(){})
        //断开数据库的连接
        mongoose.disconnect()
        Schema
        Modal
        Document
*/  
const mongoose = require("mongoose");

async function main() {
  try {
    // 连接数据库
    await mongoose.connect("mongodb://127.0.0.1/mongoose_test", {
      useNewUrlParser: true,
      useUnifiedTopology: true
    });
    console.log("数据库连接成功");
  } catch (err) {
    console.error("数据库操作出错:", err);
  }
}

main();

简单的引入mongoose对象然后调用connect方法输入我们的数据库服务器地址就可以连接了,后面的是对应的数据库名称。然后运行控制台就会提示连接成功。

​编辑

2.创建schema模式对象给我们集合限制文档格式以及Model对象的方式对文档的增删改查

javascript 复制代码
const mongoose =require("mongoose")
mongoose.connect("mongodb://127.0.0.1/mongoose_test",{
        useNewUrlParser: true,
        useUnifiedTopology: true
    }
)
mongoose.connection.once("open",function(){
  console.log(' 数据库连接成功', )
})
//创建schema模式对象
const Schema = mongoose.Schema
const stuSchema = new Schema({
    name:String,
    age:Number,
    gender:{
        type:String,
        default:'female'
    },
    address:String
})
//通过Schema创建Model 代表数据库中的集合 通过Model才能对数据库进行操作
//mongoose.model(modelName,schema)
//modelName就是映射的集合名 mongoose自动将集合名变成复数
const StuModel = mongoose.model("student",stuSchema)
//向数据库中插入文档

//    StuModel.create({name:'孙悟空',age:22,address:'花果山'}).then(()=>{
//     console.log('插入成功')
//   })
/*
  有了model就可以对数据库进行增删改查的操作
    create({docs})创建一个文档或者多个文档到数据库中

*/
    // StuModel.create([
    //     {
    //         name:'猪八戒',
    //         age:11,
    //         address:'高老庄'
    //     },
    //     {
    //         name:'唐僧',
    //         age:99,
    //         address:'长安'
    //     }
    // ]).then(()=>{
    //     console.log('插入成功')
    // })
    //find查询所有符合条件的文档 findById查询文档id属性查询文档 findOne查询第一个文档 总会返回数组
    //第二个参数要什么写什么 _id默认携带 投影(需要获取的字段)19.20
    // StuModel.find({name:'孙悟空'},{name:1}).then((item)=>{
    //     console.log('item',item)
    // })
    //findOne返回的是一个具体的文档对象
    //   StuModel.findOne({name:'孙悟空'},{name:1}).then((item)=>{
    //     console.log('item',item.name)
    // })
    //根据Id找 不需要加ObjectId
    //   StuModel.findById("68a3f28b84b6107ef437811a",{name:1}).then((item)=>{
    //     console.log(item instanceof StuModel) //true
    //     console.log('item',item)
    // })
    //item就是通过find查询的结果 就是document文档对象
    //document对象是Model的实例 集合是谁就是谁的实例

    /*
        修改
            update用来修改或者多个文档 参数conditions 查询条件
                                    doc 修改后的对象
                                    options配置参数
    /
    // StuModel.find({}).then(item=>{
    //     console.log(item)
    // }
    // )
    // StuModel.updateOne({name:'唐僧'},{$set:{age:20}}).then(item=>{
    //     console.log(item)
    // })
    /
        删除
            都是传一个条件
            remove
            deleteOne
            deleteMany
    */
//    StuModel.deleteMany({name:'孙悟空'}).then(item=>{
//     console.log(item)
//    })
 StuModel.countDocuments({}).then(count => {
  console.log("文档总数:", count)
})

这里我们用model方法比如find.delete,findOneAndUpdate({},{})等对文档进行增删改查后,数据库对应model集合数据就会对应的增删改查。

​编辑

​编辑

值得一提的是现在版本的mongoose的增删改查方法都为异步比如find之后需要用.then去获取查找的数据。其他同理。

3.文档对象

文档对象是根据我们创建好的model对象生成的,里面的方法比如save存到集合中,不过很少用,知道就可以,一般只用model就可以满足大多需要。

javascript 复制代码
/*
    Document和集合中的文档一一对应
        Document是Model的实例
        通过Model查询到的结果都是Document
*/
//创建一个Document
const mongoose =require("mongoose")
mongoose.connect("mongodb://127.0.0.1/mongoose_test",{
        useNewUrlParser: true,
        useUnifiedTopology: true
    }
)
mongoose.connection.once("open",function(){
  console.log(' 数据库连接成功', )
})
//创建schema模式对象
const Schema = mongoose.Schema
const stuSchema = new Schema({
    name:String,
    age:Number,
    gender:{
        type:String,
        default:'female'
    },
    address:String
})
// 根据 schema 创建模型(注意名字)
const StuModel = mongoose.model("student", stuSchema)  
const stu = new StuModel({
    name:'上博客',
    age:44,
    address:'波比'
})
console.log(stu)
/*
    document方法
        save
        update
            --修改对象 不用传条件
        remove
*/
// stu.save().then(()=>{
//     console.log('保存成')
// })
StuModel.findOneAndUpdate({name:'唐僧'},{$set:{age:100}},{new:true}).then(item=>{
    console.log('找到并更新成功',item)
})
/*
    get()
    set()
*/

相关推荐
程序员爱钓鱼6 小时前
Go语言实战案例 — 工具开发篇:实现一个图片批量压缩工具
后端·google·go
ChinaRainbowSea8 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
舒一笑8 小时前
同步框架与底层消费机制解决方案梳理
后端·程序员
minh_coo8 小时前
Spring框架事件驱动架构核心注解之@EventListener
java·后端·spring·架构·intellij-idea
白初&9 小时前
SpringBoot后端基础案例
java·spring boot·后端
计算机学姐12 小时前
基于Python的旅游数据分析可视化系统【2026最新】
vue.js·后端·python·数据分析·django·flask·旅游
该用户已不存在12 小时前
你没有听说过的7个Windows开发必备工具
前端·windows·后端
David爱编程13 小时前
深入 Java synchronized 底层:字节码解析与 MonitorEnter 原理全揭秘
java·后端
KimLiu13 小时前
LCODER之Python:使用Django搭建服务端
后端·python·django
再学一点就睡13 小时前
双 Token 认证机制:从原理到实践的完整实现
前端·javascript·后端