• 100 # mongoose 的使用


    mongoose

    elegant mongodb object modeling for node.js

    https://mongoosejs.com/

    安装 mongoose

    npm i mongoose
    
    • 1

    基本示例

    const mongoose = require("mongoose");
    
    // 1、连接 mongodb
    let conn = mongoose.createConnection("mongodb://kaimo313:kaimo313@localhost:27017/user", {
        useNewUrlParser: true,
        useUnifiedTopology: true
    });
    conn.on("connected", () => {
        console.log("链接成功");
    });
    
    // 2、Schema 骨架,根据这个骨架来创建内容,用来规范文档的
    let StudentSchema = new mongoose.Schema(
        {
            username: {
                type: String,
                required: true
            },
            password: String,
            age: Number,
            birthday: {
                type: Date,
                default: Date.now
            }
        },
        {
            collection: "Student" // 设置固定的名字
        }
    );
    
    // 3、通过骨架来创建模型 -> 集合 db.student.insert()
    let Student = conn.model("Student", StudentSchema);
    
    // 4、模型可以操作数据
    Student.create({
        username: "kaimo001",
        password: "kaimo001",
        test: "测试多余数据"
    }).then((doc) => {
        console.log(doc);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    启动

    nodemon mongoose.js
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    新增改查,分页

    const mongoose = require("mongoose");
    
    // 1、连接 mongodb
    let conn = mongoose.createConnection("mongodb://kaimo313:kaimo313@localhost:27017/user", {
        useNewUrlParser: true,
        useUnifiedTopology: true
    });
    conn.on("connected", () => {
        console.log("链接成功");
    });
    
    // 2、Schema 骨架,根据这个骨架来创建内容,用来规范文档的
    let StudentSchema = new mongoose.Schema(
        {
            username: {
                type: String,
                required: true
            },
            password: String,
            age: Number,
            birthday: {
                type: Date,
                default: Date.now
            },
            hobby: [String]
        },
        {
            collection: "Student" // 设置固定的名字
        }
    );
    
    // 3、通过骨架来创建模型 -> 集合 db.student.insert()
    let Student = conn.model("Student", StudentSchema);
    
    // 4、模型可以操作数据
    (async () => {
        // 1) 批量插入:
        let arr = [];
        for (let i = 0; i < 4; i++) {
            arr.push({
                username: "kaimo" + i,
                password: "kaimo" + i,
                age: i
            });
        }
        let r1 = await Student.create(arr);
        console.log("批量插入----->", r1);
    
        // 2) 查询操作:findOne 是查询一个;find 是查询一组,查询的结果只采用某个几个字段
        // _id 比较特殊需要单独控制,username: 1, password: 1 表示显示该字段
        let r2 = await Student.findOne({ username: "kaimo1" }, { username: 1, password: 1 });
        // await Student.findById("652e81753e38c888970b3846");
        console.log("查询操作----->", r2);
    
        // 3) 修改操作 (查询条件,修改成的结果)
        // 修改所有年龄大于2的,年龄都加10
        // where 基本不用,性能差 ({$where: "age>2"})
        // 操作符:lt: 小于 gt:大于 lte:小于等于 lgt:大于等于 inc:递增
        let r3 = await Student.updateOne({ age: { $gt: 2 } }, { $inc: { age: 10 } });
        console.log("修改操作--r3--->", r3);
        // 加个字段,新增 set
        let r4 = await Student.updateOne({ username: /kaimo1/ }, { $set: { password: "123456" } });
        console.log("修改操作--r4--->", r4);
        // 数组新增用 push,不重复添加用 addToSet
        let r5 = await Student.updateOne({ username: /kaimo1/ }, { $push: { hobby: ["睡觉1", "睡觉2"] } });
        console.log("修改操作--r5--->", r5);
        // 多条件(or)删除(pop)数组第一个
        let r6 = await Student.updateOne({ $or: [{ username: /kaimo1/ }, { age: 1 }] }, { $pop: { hobby: -1 } });
        console.log("修改操作--r6--->", r6);
    
        // 4) 删除
        // Student.deleteOne(); Student.deleteMany();
    
        // 5) 分页查询
        let limit = 2; // 每页2条
        let currentPage = 2; // 当前是第2页
        let skip = (currentPage - 1) * limit;
        // find 返回的是一个游标,并不是一个结果;查询 -> 排序 -> 跳过 -> 限制
        let r7 = await Student.find({}).limit(limit).skip(skip).sort({ age: -1 });
        console.log("分页查询--r7--->", r7);
    })();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    连表查询

    const mongoose = require("mongoose");
    
    // 1、连接 mongodb
    let conn = mongoose.createConnection("mongodb://kaimo313:kaimo313@localhost:27017/user", {
        useNewUrlParser: true,
        useUnifiedTopology: true
    });
    conn.on("connected", () => {
        console.log("链接成功");
    });
    
    // 学生模型
    let StudentSchema = new mongoose.Schema(
        {
            username: {
                type: String,
                required: true
            },
            password: String,
            age: Number,
            birthday: {
                type: Date,
                default: Date.now
            },
            hobby: [String]
        },
        {
            collection: "Student" // 设置固定的名字
        }
    );
    
    let Student = conn.model("Student", StudentSchema);
    
    // 作业模型
    let HomeWorkSchema = new mongoose.Schema(
        {
            title: String,
            content: String,
            student: {
                ref: "Student",
                type: mongoose.SchemaTypes.ObjectId // 用户id
            }
        },
        {
            collection: "Homework" // 设置固定的名字
        }
    );
    let HomeWork = conn.model("Homework", HomeWorkSchema);
    
    (async () => {
        let user = await Student.create({ username: "kaimo666", password: "123456" });
    
        let home = await HomeWork.create({
            title: "第一篇作业",
            content: "第一篇作业的内容",
            student: user._id
        });
        console.log(home);
        // 连表查询
        let r = await HomeWork.findById("653538ed066785338ab72d81").populate("student", { username: 1 });
        console.log("连表查询--r-->", r);
        // 修改:通过模型来操作;通过文档自己操作自己
        r.title = "修改后的标题";
        await r.save();
    })();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
  • 相关阅读:
    【机组】计算机系统组成课程笔记 第二章 计算机中的信息表示
    java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码
    HTML如何设置字体样式?
    软考高级系统架构设计师系列之:数学与经济管理
    高阶导数习题
    JAVA定时任务怎么实现
    使用ChatGPT创建Makefile构建系统:使用Make运行Docker
    微服务开发平台 Spring Cloud Blade 部署实践
    B+树索引(10)之回表的代价
    SaaSBase:什么是SaleSmartly?
  • 原文地址:https://blog.csdn.net/kaimo313/article/details/133980367