100 # mongoose 的使用

mongoose

elegant mongodb object modeling for node.js

https://mongoosejs.com/

安装 mongoose

bash 复制代码
npm i mongoose

基本示例

javascript 复制代码
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);
});

启动

bash 复制代码
nodemon mongoose.js

新增改查,分页

javascript 复制代码
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);
})();

连表查询

javascript 复制代码
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 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
聂 可 以13 小时前
Windows环境安装MongoDB
数据库·mongodb
web前端神器13 小时前
mongodb多表查询,五个表查询
数据库·mongodb
wusong99914 小时前
mongoDB回顾笔记(一)
数据库·笔记·mongodb
真心喜欢你吖14 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
changuncle14 小时前
MongoDB数据备份与恢复(内含工具下载、数据处理以及常见问题解决方法)
数据库·mongodb
斯普信专业组1 天前
MongoDB调优利器:掌握性能分析工具mongostat
数据库·mongodb·mongostat
小菜鸟学代码··1 天前
单片机电路基本知识
单片机·嵌入式硬件·mongodb
天草二十六_简村人2 天前
Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
java·jvm·数据库·mongodb·阿里云·微服务·云计算
weixin_449310842 天前
如何高效集成YS网店客户和组织映射数据到MongoDB
数据库·mongodb