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

相关推荐
evans在进步11 分钟前
Spring Boot 工程化核心详解:Parent、Starter、热部署、事务与多数据源
spring boot·后端·python
宫水三叶的刷题日记1 小时前
馋猫外卖:AI 让字节式试错没有天花板
后端
SomeB1oody1 小时前
【RustyML入门】7.4. 按需裁剪与模块化集成
开发语言·后端·机器学习·rust·教程
罗超驿1 小时前
SpringBoot 快速入门
java·spring boot·后端
卷无止境2 小时前
除了开发api,FastAPI其实也可以配合jinja2模板写页面
后端·python·fastapi
newerp2 小时前
Redis 操作与缓存策略
后端·程序员·go
newerp2 小时前
GORM ORM 基础
后端·程序员·go
小岛前端2 小时前
AI Skills 已经封神,但新的问题却越来越严重!
前端·后端·github
拖孩2 小时前
一个人 + AI 做的小程序,上线 15 天赚了 10 块 5
前端·后端·微信小程序
newerp3 小时前
CRUD 操作与预处理语句
后端·程序员·go