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()
*/

相关推荐
IT_陈寒1 小时前
React Hooks 实战:这5个自定义Hook让我开发效率提升了40%
前端·人工智能·后端
开始学java1 小时前
异常机制-异常分类
后端
小虚竹and掘金1 小时前
Claude Sonnet 4.5 编程王位世袭罔替!全网首发最全1.3万字详细测评,国内直接使用
后端
做运维的阿瑞1 小时前
使用 Python 打造一个轻量级系统信息查看器
开发语言·后端·python·系统架构
起风了___2 小时前
Docker 一键部署指南:GitLab、Nacos、Redis、MySQL 与 MinIO 全解析
后端·docker
用户4099322502122 小时前
PostgreSQL视图不存数据?那它怎么简化查询还能递归生成序列和控制权限?
后端·ai编程·trae
karry_k2 小时前
CopyOnWriteArraySet
后端
spmcor2 小时前
NestJS 统一响应格式最佳实践:标准化 API 返回结构
后端
SamsongSSS2 小时前
Django之APPEND_SLASH配置爬坑
后端·python·django
EMQX3 小时前
ESP32 + MCP over MQTT:基于大模型打造人格化情感智能体
后端