moogose使用

概念

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();// orawait 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.hqwc.cn/news/267912.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

液态二氧化碳储存罐远程无线监测系统

二氧化碳强化石油开采技术,须先深入了解石油储层的地质特征和二氧化碳的作用机制。现场有8辆二氧化碳罐装车,每辆罐车上有4台液态二氧化碳储罐,每台罐的尾部都装有一台西门子S7-200 smart PLC。在注入二氧化碳的过程中,中控室S7-1…

算法:买卖股票的最佳时机(快慢指针和动态规划)

快慢指针 时间复杂度 O(n) 空间复杂度 O(1) /*** param {number[]} prices* return {number}*/ var maxProfit function (prices) {let l 0let r 1let temp 0while (r < prices.length - 1) {// 如果当前左值大于右值说明当前不是最佳买入时机// 所以将右指针赋值给左指…

Amazon CodeWhisperer 审查:最新的 AI 代码伴侣

最近&#xff0c;亚马逊云科技宣布了一项机器学习支持的服务&#xff0c;该服务通过根据开发人员在自然语言中的评论和他们在集成开发环境中的代码生成代码建议来帮助提高开发人员的工作效率。这项名为 Amazon CodeWhisprer 的服务仍处于预览阶段&#xff0c;可以免费使用。这项…

strict-origin-when-cross-origin

严格限制同源策略 &#xff08;1&#xff09;允许服务器的同源IP地址访问 &#xff08;2&#xff09;允许Referer --- 后端服务器要配置

plf::list原理分析

plf::list是一个比std::list性能要好的另外一种实现&#xff0c;根据作者的性能测试&#xff1a; 293% faster insertion 57% faster erasure 17% faster iteration 77% faster sorting 70% faster reversal 91% faster remove/remove_if 63% faster unique 811% faster clear …

kettle+report designer导出带样式的excel包含多个sheet页

场景介绍&#xff1a; 运用pentaho report designer报表设计器&#xff0c;查询数据库字典表生成带有样式的excel&#xff0c;通过kettle pentaho报表输出组件导出形成数据字典&#xff0c;最终形成的数据字典样式如下图&#xff1a; 案例适用范围&#xff1a; pentaho repor…

智物发布MT6877平台无线AR智能眼镜参考设计,推动下一代无线AR发展

随着增强现实(AR)技术的不断发展&#xff0c;有线AR眼镜在连接和使用方面存在一些限制。为了解决这些问题&#xff0c;无线AR智能眼镜的推出势在必行。 新一代无线AR智能眼镜采用了天玑900&#xff08;MT6877&#xff09;平台作为参考设计&#xff0c;搭载了2.4GHz的八核处理器…

c/c++ 柔性数组

在C99新增特性中&#xff0c;结构体的 最后一个元素 允许是 未知大小的数组 &#xff0c;这样就叫做柔性数组成员。 struct stu{ int i&#xff1b; char c; int arr[ ]; //未知大小数组&#xff0c;并且是整个结构体最后一个成员 } 这个时候结构体所占字节空间是多少&#xf…

文生图:AE/VAE/VQVAE/VQGAN/DALLE模型

文生图模型演进&#xff1a;AE、VAE、VQ-VAE、VQ-GAN、DALL-E 等 8 模型本文中我们回顾了 AE、VAE、VQ-VAE、VQ-VAE-2 以及 VQ-GAN、DALL-E、DALL-E mini 和 CLIP-VQ-GAN 等 8 中模型&#xff0c;以介绍文生图模型的演进。https://mp.weixin.qq.com/s/iFrCEpAJ3WMhB-01lZ_qIA 1…

html创建电子邮件链接

refer: 可以在a标签里使用&#xff1a; <a href"mailto:nameemail.com">Email</a>

Python常见面试知识总结(二):数据结构、类方法及异常处理

【十三】Python中assert的作用&#xff1f; Python中assert&#xff08;断言&#xff09;用于判断一个表达式&#xff0c;在表达式条件为 f a l s e false false的时候触发异常。 断言可以在条件不满足程序运行的情况下直接返回错误&#xff0c;而不必等待程序运行后出现崩溃…

硬件开发笔记(十六):RK3568底板电路mipi摄像头接口原理图分析、mipi摄像头详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134922307 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…