moogose使用

news2024/11/24 16:18:19

概念

Node.js 的优雅 mongodb 对象建模

Mongoose 提供了一种直接的、基于模式的解决方案来对应用程序数据进行建模。它包括开箱即用的内置类型转换、验证、查询构建、业务逻辑挂钩等

安装

 npm i mongoose

具体例子

E:\Nextjs\mongoose-use-demo\app\api[crud]\route.ts

连接数据库

E:\Nextjs\mongoose-use-demo\lib\db.ts

import mongoose from 'mongoose';

export const connectDB = async () => {
    try {
        await mongoose.connect(process.env.MONGO_URI as string)
        console.log('db is connect with', mongoose.connection.host);
    } catch (error) {
        console.log("Error connecting to MongoDB: ", error);
    }
}

E:\Nextjs\mongoose-use-demo.env.local

MONGO_URI=mongodb://127.0.0.1:27017/mongoose-use-demo

定义架构(表中字段)

Mongoose 中的一切都始于架构。每个架构映射到一个 MongoDB 集合定义该集合 中 文档的形状

import mongoose from 'mongoose';
const { Schema } = mongoose;

const blogSchema = new Schema({
  title: String, // String is shorthand for {type: String}
  author: String,
  body: String,
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },
  hidden: Boolean,
  meta: {
    votes: Number,
    favs: Number
  }
});

https://mongoosejs.com/docs/guide.html

简单例子

const User = new Schema({
    name: String,
    age: Number,
    sex: String
});

代码将在每次测试之前尝试创建一个名为“ModelName”的新模型

用户架构

src/models/User.js

import mongoose from "mongoose";

const { Schema } = mongoose;

const userSchema = new Schema(
  {
    name: {
      type: String,
      unique: true,
      required: true,
    },
    email: {
      type: String,
      unique: true,
      required: true,
    },
    password: {
      type: String,
      required: true,
    },
  },
  { timestamps: true }
);

//If the User collection does not exist create a new one.
export default mongoose.models.User || mongoose.model("User", userSchema);

文章架构

src/models/Post.js

import mongoose from "mongoose";

const { Schema } = mongoose;

const postSchema = new Schema(
  {
    title: {
      type: String,
      required: true,
    },
    desc: {
      type: String,
      required: true,
    },
    img: {
      type: String,
      required: true,
    },
    content: {
      type: String,
      required: true,
    },
    username: {
      type: String,
      required: true,
    },
  },
  { timestamps: true }
);

//If the Post collection does not exist create a new one.
export default mongoose.models.Post || mongoose.model("Post", postSchema);

自动建立时间戳

const User = new Schema({
    name: String,
    age: Number,
    sex: String
},{
	timestamps:true
});

https://mongoosejs.com/docs/timestamps.html

const userSchema = new Schema({ name: String }, { timestamps: true });
const User = mongoose.model('User', userSchema);

let doc = await User.create({ name: 'test' });

console.log(doc.createdAt); // 2022-02-26T16:37:48.244Z
console.log(doc.updatedAt); // 2022-02-26T16:37:48.244Z

如果集合中有文档,再添加新的字段

新添加的文档有新字段,旧的没有

在这里插入图片描述

创建模型(表)

将架构转换成可使用的模型,模型是从架构定义编译而来的奇特构造函数,模型的实例称为文档模型负责从底层 MongoDB 数据库创建和读取文档

当您在架构上调用 mongoose.model() 时,Mongoose 会为您编译一个模型

mongoose.model(modelName, schema)

用法

const UserModel = mongoose.model('User', User);

但是实际使用中我们更倾向使用下面的用法

export const userModal = mongoose.models.users || mongoose.model('users',Schema)

如果存在users模型,就不需要再创建,重复创建同一名字的模型会报错

创建文档(记录)

模型的实例称为文档。创建它们并将其保存到数据库很容易

const Tank = mongoose.model('Tank', yourSchema);

const small = new Tank({ size: 'small' });
await small.save();

// or

await Tank.create({ size: 'small' });

// or, for inserting large batches of documents
await Tank.insertMany([{ size: 'small' }]);

例子

const user = await userModal.create({
    name: username,
    age: parseInt(age),
    sex
})

查询文档

集合中的文档

在这里插入图片描述

找多个文档时

find()

可以传三个参数

  • filter «Object|ObjectId» 过滤
  • [projection] «Object|String|Array[String]» 返回特定存在的字段
  • [options] «Object» 限制数量、跳过查询等等

https://mongoosejs.com/docs/api/query.html#Query.prototype.select()

https://mongoosejs.com/docs/api/query.html#Query.prototype.setOptions()

查找集合中所有文档

const users = await userModal.find({});

在这里插入图片描述

查找某个特定属性的文档

const users = await userModal.find({name:'aaa'},"name");

在这里插入图片描述

筛选某个属性小于某个值的文档

 const users = await userModal.find({ age: { $lte: 7 } })

or

const users = await userModal.find({}).where('age').lt(7)

在这里插入图片描述

模糊查询(正则)

name字段有aa值的文档

const users = await userModal.find({ name: /aa/i },"name sex")

只显示name和sex字段

在这里插入图片描述

find()第二个参数可以传字符串

// include a and b, exclude other fields
query.select('a b');
// Equivalent syntaxes:
query.select(['a', 'b']);
query.select({ a: 1, b: 1 });

跳过

const users = await userModal.find({},null,{skip:5});

在这里插入图片描述

筛选出符合多个条件的文档

User.find({ age: { $gte: 21, $lte: 65 } });

只找一个文档时

通过id找文档

这个id是文档唯一标识_id

const users = await userModal.findById('656c6f5ece8ea04466736424')

在这里插入图片描述

在多个匹配文档中选第一个findOne()

const users = await userModal.findOne({name:'aaa'},"name");

在这里插入图片描述

更改文档

const users = await userModal.updateOne({name:'aa'},{name:'aa1',sex:'woman'});

在这里插入图片描述

根据id更改

await Topic.findByIdAndUpdate(id, { title, description });

删除文档

const users = await userModal.deleteOne({name:'aaa'});

根据id删除

 await Topic.findByIdAndDelete(id);

偶尔分享web开发知识
小破站
blog

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

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

相关文章

数据结构:栈(Stack)的各种操作(入栈,出栈,判断栈非空,判断栈已满,附源码)

前言:在前面的文章中,我们讲解了顺序表,单链表,双向链表。而我们今天要分享的栈则是基于之前的数据结构上搭建的,但是相较于顺序表和链表来说,栈的实现就非常简单了。 目录 一.栈(Stack)的概念 二.栈的数…

TOWE 高品质220V/380V工业插头插座:插座篇

在不同工业场合和环境中,对工业用插头插座和耦合器的配置有着不同的要求。在实际应用中,我们要根据用途、工作环境、规格大小、外观造型、安装形式、功能等方面进行选择。只有确保正确选择产品,才能确保现实用电环境的安全、高效。 同为科技&…

什么是 web 组态?web 组态与传统组态的区别是什么?

组态软件是一种用于控制和监控各种设备的软件,也是指在自动控制系统监控层一级的软件平台和开发环境。这类软件实际上也是一种通过灵活的组态方式,为用户提供快速构建工业自动控制系统监控功能的、通用层次的软件工具。通常用于工业控制,自动…

数据库——字段拆分与合并

一、GP或PostgreSQL 1.字段拆分成行 unnest(string_to_array(test, ,)) 例如某一字段值为"a,b,c,d",使用string_to_array将其拆分为数组,然后使用unnest将数组平铺成一张表 SELECT unnest(string_to_array(555,666,777, ,)) 2.字段拆分成列…

一文告诉您企业为什么这么关注数字资产指纹

数字资产指纹 在互联网数字资产管理中,数字资产指纹就是数字资产的“身份证”,也是信息系统安全管理工作的基础。通过网络资产探测(指纹)可以在0day(通常是指还没有补丁的漏洞) 爆发时快速匹配到受影响的信…

B029-JDBC增强

目录 PreparedStatement 查询1.sql注入2.Statement分析 (面试题)3.PreparedStatement (面试题) 登录功能的完善事务链接池概念实现DBCP连接池实现第一种配置方式第二种配置方式 返回主键BaseDao的抽取 PreparedStatement 查询 1.sql注入 就是在sql的字符串拼接的时候&#xf…

ChibiOS简介3/5

ChibiOS简介3/5 1. 源由2. ChibiOS基础知识3/52.7 Chapter 7 - RT Time and Intervals2.7.1 Basic concepts2.7.2 APIs 2.8 Chapter 8 - RT Virtual Timers2.8.1 Basic concepts2.8.2 Tickless Mode2.8.3 APIs 2.9 Chapter 9 - RT Scheduler2.9.1 Basic concepts2.9.2 System C…

两线制无源 4-20mA 回路供电隔离变送器

两线制无源 4-20mA 回路供电隔离变送器 一入一出两线制无源 4-20mA 回路供电隔离变送器 概述:JSD TAW-1001D-100L-F 系列隔离变送器是 4-20mA 两线制回路供电的电流隔离变送配电器,该隔离变送器采用电磁隔离技术,并通过输入端馈电方式,给输入端两线制仪器仪表设备供…

数据库 02-03补充 聚合函数--一般聚合分组和having

聚合函数: 01.一般的聚合函数: 举个例子: 一般聚合函数是用于单个元祖,就是返回一个数值。 02.分组聚合:可以返回多个元祖 举个例子: 分组的注意: 主要的是根据分组的话,一个…

【git push ERROR: commit id: missing Change-Id in message footer】

使用 gerrit 后,提交代码会出现如下截图问题: 临时解决: step1: 把上面红色的那条gitidir复制下来执行下: step2:执行下面的命令会添加change_id git commit --amendstep3: 然后推送代码到服务器上 git push origin HEAD:refs/fo…

万界星空科技电子装配行业MES解决方案

电子电器装配属于劳动密集型、科技含量较高的行业,产品零部件种类繁多,生产组装困难,生产过程存在盲点,同时也决定了生产流水线多且对自动化水平要求较高。 万界星空科技提供的电子行业MES解决方案,提供从仓储管理、生…

排序算法:【选择排序]

一、选择排序——时间复杂度 定义:第一趟排序,从整个序列中找到最小的数,把它放到序列的第一个位置上,第二趟排序,再从无序区找到最小的数,把它放到序列的第二个位置上,以此类推。 也就是说&am…

STM32 CAN多节点组网项目实操 挖坑与填坑记录

摘要 CAN线性组网项目开发过程中遇到的数据丢包问题,并尝试解决的记录和推测分析。 关键词 CAN串联多节点通讯、CAN10节点通讯、CAN数据丢包、STM32 CAN 背景/项目介绍 概述: 开发了一个多节点线性组网采集数据的项目。 系统包含1个供电和数据网关板还有…

如何利用Guava优化Java网络编程

第1章:引言 大家好!今天小黑要和咱们聊聊一个很酷的话题:如何利用Google的Guava库来优化Java网络编程。网络编程,这玩意儿听起来就高大上,不是吗?但实际上,它充满了各种挑战。从处理复杂的数据…

【二分查找】【滑动窗口】LeeCode2528:最大化城市的最小电量

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 滑动窗口 题目 给你一个下标从 0 开始长度为 n 的整数数组 stations ,其中 stations[i] 表示第 i 座城市的供电站数目。 每个供电站可以在一定 范围 内给所有城…

OpenHarmony创新赛人气投票活动,最佳人气作品由你来定!

12月1日至12月15日 十大入围作品线上投票激战正酣 最佳人气作品,由你来定! 投票链接:OpenHarmony创新赛人气作品投票正式开启——最佳人气作品,由你来定! - 文章 OpenHarmony开发者论坛

uniCloud(一) 新建项目、初始化服务空间、云对象访问测试

一、新建一个带有unicloud 二、创建一个服务空间 1. 右键uniCloud,关联云服务空间 我当前没有服务空间,需要新建一个服务空间,之后将其关联。初始化服务空间需要的时间有点长 服务空间初始化成功后,刷新HBuilder,勾选…

vue3使用Mars3D写区块地图

效果图 引入相关文件 因为我也是第一次使用&#xff0c;所以我是把插件和源文件都引入了&#xff0c;能使用启动 源文件 下载地址&#xff1a; http://mars3d.cn/download.html 放入位置 在index.html中引入 <!--引入cesium基础lib--><link href"/static/C…

互联网加竞赛 opencv 图像识别 指纹识别 - python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…

【Docker】从零开始:18.使用Dockerfile构造自己的KingbaseES数据库镜像

【Docker】从零开始&#xff1a;17.使用Dockerfile构造自己的数据库镜像 新建一个自定义目录并创建Dockerfile文件上传需要的文件到自定义目录下注意docker-circle-init.sh文件内容password 内容 开始打包注意打包完成后执行 尝试用工具连接数据库 kingbase.tar.gz 包过大我就上…