100 # mongoose 的使用

news2024/9/22 5:26:54

mongoose

elegant mongodb object modeling for node.js

https://mongoosejs.com/

安装 mongoose

npm i mongoose

基本示例

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);
});

启动

nodemon mongoose.js

在这里插入图片描述

在这里插入图片描述

新增改查,分页

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);
})();

连表查询

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();
})();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1122496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python算法

第一章 算法 一系列解决单个或多个问题&#xff0c;或有执行计算机功能的命令集合。人类在解决复杂问题时所采用的一系列特定的方法&#xff0c;即为算法。 算法与程序的区别 程序指一组计算机能识别和执行&#xff0c;并有一定功能的指令。程序是以计算机能理解的各式各样的…

CCF CSP认证 历年题目自练Day37

题目一 试题编号&#xff1a; 201312-3 试题名称&#xff1a; 最大的矩形 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   在横轴上放了n个相邻的矩形&#xff0c;每个矩形的宽度是1&#xff0c;而第i&#xff08;1 ≤ i ≤ n&a…

SLAM ORB-SLAM2(6)系统对象

SLAM ORB-SLAM2(6)系统对象 1. 封装2. 成员变量2.1. 核心数据2.2. 三个对象2.3. 三个线程2.4. 跟踪状态3. 成员函数4. 构造函数5. 数据驱动接口1. 封装 在 《SLAM ORB-SLAM2(5)例程了解》 了解到创建了一个 ORB_SLAM2::System 类型的对象 然后不断的把数据供给该对象就可以…

图论02-【无权无向】-图的深度优先遍历DFS

文章目录 1. 代码仓库2. 深度优先遍历图解3. 主要代码3.1 dfs递归的主要代码 - 先序遍历和后序遍历3.2 dfs非递归的主要代码 - 使用栈3.3 递归与非递归遍历出来的顺序不一致3.4 标记不同的联通分量 4. 完整代码4.1 CC.java4.2 Graph.java 1. 代码仓库 https://github.com/Chufe…

【计算机网络】TCP 协议的相关特性

TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的协议。以下是TCP协议的相关特性&#xff1a; 可靠性&#xff1a;TCP通过确认和重传机制保证数据的可靠传输。 面向连接&#xff1a;TCP在传输数据前需要先建立连接。连接的建立过程包括三次握手…

03、Python 字符串高级用法

目录 Python 字符串高级用法转义字符字符串格式化序列相关的方法大小写相关的方法dir 可以查看某个类的所有方法删除空白查找、替换相关方法 Python 字符串高级用法 转义字符 字符串格式化 序列相关的方法 字符串本质就是由多个字符组成&#xff0c;字符串的本质就是不可变序…

Metabase:简单快捷的商业智能与数据分析工具 | 开源日报 No.61

moby/moby Stars: 66.8k License: Apache-2.0 Moby 是一个由 Docker 创建的开源项目&#xff0c;旨在实现和加速软件容器化。它提供了工具包组件的“乐高集”&#xff0c;可以将它们组装成基于容器的自定义系统的框架。组件包括容器生成工具、容器注册表、业务流程工具、运行时…

字节码进阶之javassist字节码操作类库详解

字节码进阶之javassist字节码操作类库详解 文章目录 前言使用教程添加Javassist依赖库创建和修改类方法拦截创建新的方法 进阶用法创建新的注解创建新的接口创建新的构造器生成动态代理修改方法示例2 前言 Javassist&#xff08;Java programming assistant&#xff09;是一个…

C#实现数据导出任一Word图表的通用呈现方法及一些体会

疲惫的修改 应人才测评产品的需求&#xff0c;导出测评报告是其中一个重要的环节&#xff0c;报告的文件类型也多种多样&#xff0c;其中WORD输出也扮演了一个重要的角色。 实现方法比较简单&#xff0c;结合分析结果数据&#xff0c;通过WORD模板文件进行替换输出。在实现的…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第二章 线程同步精要

并发编程有两种基本模型&#xff0c;一种是message passing&#xff0c;另一种是shared memory。在分布式系统中&#xff0c;运行在多台机器上的多个进程的并行编程只有一种实用模型&#xff1a;message passing。在单机上&#xff0c;我们也可以照搬message passing作为多个进…

【JavaEE】初识计算机网络(TCP/IP五层模型及封装和分用)

一、 网络通信基础 网络互连的目的是进行网络通信&#xff0c;也即是网络数据传输&#xff0c;更具体一点&#xff0c;是网络主机中的不同进程间&#xff0c;基于网络传输数据。 那么&#xff0c;在组建的网络中&#xff0c;如何判断到底是从哪台主机&#xff0c;将数据传输到…

仿CSGO盲盒开箱源码 盲盒商城源码 盲盒开箱源码 潮物盲盒商城源码

仿CSGO盲盒开箱源码 盲盒商城源码 盲盒开箱源码 潮物盲盒商城源码 测试环境&#xff1a;宝塔、Linux、PHP7.2、MySQL5.6 根目录 public&#xff0c;伪静态 thinkphp&#xff0c;php需要Redis扩展 后台&#xff1a;/stf 账号&#xff1a;admin 密码&#xff1a;123123 *后台…

【量化交易笔记】11.移动平均交易策略

概述 上一节我们建立了最最简单的交易策略&#xff0c;尽管有了盈利&#xff0c;但实际操作上是不可行的。本节将运用移动平均指标&#xff0c;包括单一移动平均策略和双移动平均策略&#xff0c;来建立经典的移动平均策略。 数据采集处理 本文采用上一节的相同数据&#xf…

Python基础入门例程1-NP1 Hello World!

描述 将字符串 Hello World! 存储到变量str中&#xff0c;再使用print语句将其打印出来。 输入描述&#xff1a; 无 输出描述&#xff1a; 一行输出字符串Hello World! 解答&#xff1a; str "Hello World!" print(str) 解释说明&#xff1a; 赋值变量&…

AD9371 官方例程HDL详解之JESD204B TX_CLK生成 (二)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

[H5动画制作系列]雪花随机产生飘落

雪花图片参考: 全局代码: var max120; var index0; 第一帧代码: index; if(index<max){posX550*Math.random();posY220*Math.random()-100;scale0.8*Math.random()0.2;var snowflakenew lib.snowlink();snowflake.xposX;snowflake.yposY;snowflake.scaleXscale;snowflake…

SpringBoot 实体参数(用于请求参数比较多时使用)

字段必须和传参时一致&#xff0c;否则为null&#xff0c; 使用AITINS可以快速生成&#xff0c;SET GET方法 public class User {//字段必须和传参时一致&#xff0c;否则为nullprivate String user;private String password;public String getUser() {return user;}public vo…

使用screen实现服务器代码一直运行

1.安装screen sudo apt install screen 2.创建一个screen&#xff08;创建一个名为chatglm的新的链接&#xff0c;用来一直运行 screen -S chatglm 3.查看进程列表 screen -ls 创建之后&#xff0c;就可以在当前窗口利用cd命令进入要执行的项目中&#xff0c;开始执行&#xf…

MIT 6.s081操作系统实验 Lab2: system calls

文章目录 1 System call tracing1.1 主要思路1.2 系统调用流程 2 Sysinfo2.1 kernel/kalloc.c 此文件用于实现分配物理空间的函数2.1.1 结构体定义2.1.2 空闲链表初始化2.1.3 内存的分配和释放2.1.4 获取空闲内存字节数 2.2 kernel/proc.c 此文件用于进程管理2.3 sys_Sysinfo2.…

Openssl数据安全传输平台006:粘包的处理-代码框架及实现-TcpSocket.cpp

文章目录 0. 代码仓库1. TCP通信粘包问题2. 粘包、拆包表现形式2.1 正常情况2.2 两个包合并成一个包2.3 出现了拆包 3. 粘包的处理-参考仓库中的文件TcpSocket.cpp3.1 发送数据时候的处理3.2 接收数据时候的处理 0. 代码仓库 https://github.com/Chufeng-Jiang/OpenSSL_Secure_…