MongoDB + Mongoose与Node.js结合使用的后端开发的最佳实践
前端全栈开发者
共 4196字,需浏览 9分钟
·
2020-12-15 01:13
文末福利资源更新
1.为什么需要Mongoose?
你有一个数据库服务器(例如MongoDB社区服务器) 你正在运行一个Node.js脚本(作为一个进程)
2.如何连接Mongoose + MongoDB
mongoose.connect(DB_CONNECTION_STRING, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false
})
3.如何执行Mongoose操作
现在我们先来快速讨论一下Mongoose的操作,以及你应该如何执行这些操作。
Mongoose为您提供以下两种选择:
基于游标的(Cursor-based)查询 全程检索(Full fetching)查询
3.1 基于游标的(Cursor-based)查询
3.2 全程检索(Full fetching)查询
4.如何使用Mongoose模型(Models)
import mongoose from 'mongoose'
const CompletedSchema = new mongoose.Schema(
{
type: { type: String, enum: ['course', 'classroom'], required: true },
parentslug: { type: String, required: true },
slug: { type: String, required: true },
userid: { type: String, required: true }
},
{ collection: 'completed' }
)
CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })
const model = mongoose.model('Completed', CompletedSchema)
export default model
在所有需要的字段中,尽量保持 required: true
。如果你在创建对象时没有使用TypeScript这样的静态类型检查系统来协助你正确地检查属性名,那么这可以为你省去很多麻烦。另外,免费的验证也超级酷。定义索引和唯一字段。 unique
属性也可以在模式中添加。索引是一个很广泛的话题,所以我在这里就不深究了。但从大范围来看,它们确实可以帮助你加快很多查询速度。明确定义一个集合名。虽然Mongoose可以根据模型的名称自动给出一个集合名称(例如这里的 Completed
here),但在我看来这太抽象了。你至少应该知道你的数据库名称和代码库中的集合。如果可以,请使用枚举来限制值。
5.如何执行CRUD操作
5.1 Create
try {
const res = await CompletedSchema.create(record)
} catch(error) {
console.error(error)
// handle the error
}
使用async-await而不是回调(看起来不错,但没有突破性的性能优势) 在查询周围使用try-catch块,因为你的查询可能会因为一些原因而失败(重复记录、错误的值等)。
5.2 Read
const res = await CompletedSchema.find(info).lean()
你能看到那里的
lean()
函数调用吗?它对性能超级有用。默认情况下,Mongoose会处理从数据库中返回的文档,并在其上添加其神奇的方法(例如.save
)。当你使用
.lean()
时,Mongoose会返回普通的JSON对象,而不是内存和资源沉重的文档。使查询速度更快,对CPU的消耗也更小。然而,如果你确实想要更新数据,你可以省略
.lean()
(我们接下来会看到)
5.3 Update
.lean()
触发),你可以简单地去修改对象属性,然后用 object.save()
保存它。const doc = await CompletedSchema.findOne(info)
doc.slug = 'something-else'
await doc.save()
findOne
上,第二个是在 doc.save
上。const res = await CompletedSchema.updateOne(, ).lean()
并且只会对数据库进行一次调用。
5.4 Delete
使用Mongoose删除也很简单,让我们看看如何删除单个文档:
const res = await CompletedSchema.deleteOne(<condition>)
updateOne
一样 deleteOne
也接受第一个参数作为文档的匹配条件。deleteMany
,只有当你知道要删除多个文档时才使用。deleteOne
来避免意外的多次删除,特别是当你试图自己执行查询时。原文:https://www.freecodecamp.org/news/mongodb-mongoose-node-tutorial/
作者:Mehul Mohan
粉丝福利
143期留言+在看幸运用户:暂无。
临走前留下,今天的福利
福利1:《用 React.js+Egg.js 造轮子 全栈开发旅游电商应用》获取资源请在公众号对话框中回复关键字:043,如果没有关注请扫下面的二维码 福利2:在看+留言,我随机抽取一位认真留言的小伙伴,给他发一个红包奖励
最近文章
Fetch API速查表:9个最常见的API请求
什么是AVIF?如何在你的网站上使用AV1图像格式
将HTML表格转换成精美的PDF的几种方案比较
思维训练:如何设计一个JavaScript插件系统?
- END -
点赞 + 在看 + 留言,下一个幸运儿就是你!
走心的分享更容易被抽中~
开奖时间 下期文末
评论