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

相关推荐
二闹2 分钟前
三个注解,到底该用哪一个?别再傻傻分不清了!
后端
用户490558160812514 分钟前
当控制面更新一条 ACL 规则时,如何更新给数据面
后端
林太白16 分钟前
Nuxt.js搭建一个官网如何简单
前端·javascript·后端
码事漫谈17 分钟前
VS Code 终端完全指南
后端
该用户已不存在42 分钟前
OpenJDK、Temurin、GraalVM...到底该装哪个?
java·后端
怀刃1 小时前
内存监控对应解决方案
后端
码事漫谈1 小时前
VS Code Copilot 内联聊天与提示词技巧指南
后端
Moonbit1 小时前
MoonBit Perals Vol.06: MoonBit 与 LLVM 共舞 (上):编译前端实现
后端·算法·编程语言
Moonbit1 小时前
MoonBit Perals Vol.06: MoonBit 与 LLVM 共舞(下):llvm IR 代码生成
后端·程序员·代码规范
Moonbit2 小时前
MoonBit Pearls Vol.05: 函数式里的依赖注入:Reader Monad
后端·rust·编程语言