再见了,Mongoose
最近,我“狠心”抛弃了Mongoose,改用mongodb官方驱动了,主要有如下三个原因:
- 性能问题
- 质量问题
- 易用性
性能问题
性能问题总是能够引起最大的关注。看看那些口号吧,“更快、更高、更强
”,人们喜欢更快的车,更快的芯片,更快的网络,人们总是追求更快的东西。作为程序员,我也不例外,我希望我的程序能够运行得更快。
我一直思考一个问题,Mongoose和mongodb官方驱动,它们之间的性能差距
到底有多大?
于是,我做了一个实验,在同等情况下(同机器,同操作,同数据),分别用Mongoose和mongodb最新的驱动版本,进行curd
测试,每一项我进行了50
次,得出了如下数据表(单位:ms):
操作类型 | Mongoose(6.0.15) | mongodb(4.2.1) |
---|---|---|
查询 | 3.62(avg) - 2.36(min) - 5.63(max) | 1.94(avg) - 1.23(min) - 4.64(max) |
添加 | 2.20(avg) - 1.60(min) - 3.54(max) | 1.22(avg) - 0.77(min) - 1.95(max) |
更新 | 2.43(avg) - 1.83(min) - 4.28(max) | 1.90(avg) - 1.45(min) - 2.50(max) |
删除 | 1.74(avg) - 1.15(min) - 2.50(max) | 1.34(avg) - 0.86(min) - 2.02(max) |
我知道Mongoose肯定会比mongodb慢,但没想到会慢这么多,这让我大吃了一惊!查询和添加操作慢了80%
左右!上面的数据是在数据库负载很小的情况下测试的,这不是很严谨的测试,但已经可以说明一些问题了。
质量问题
这里我不是说Mongoose库的质量不好,我要表达的并不是这个。由于Mongoose是基于mongodb的,这么说吧,如果mongodb出现了问题,Mongoose一定会受影响,如果Mongoose有问题,mongodb不一定有问题。
如果你使用Mongoose,当出现问题时,虽然情况不多,但是一旦出现问题,你就需要先判断到底是Mongoose的问题,还是mongodb驱动的问题。
我不想搞得这么麻烦,我喜欢简单的模式,使用mongodb,如果出现了问题,我知道那一定是mongodb的问题了。
易用性
Mongoose的标语是“elegant mongodb object modeling for node.js”,它通过Schema来定义集合字段,我们来看一个简单例子:
const tagSchema = new mongoose.Schema({
name: { type: String, unique: true },
createdTime: { type: Date, default: Date.now }
})
const Tag = mongoose.model('Tag', tagSchema)
通过上面的定义,我们得到了一个Tag model,你可以将其理解为一个Class,然后通过new关键字来创建一个tag对象(文档),然后拆入到集合中:
const newTag = new Tag({ name: 'foo' })
await newTag.save()
既然ES6已经提供了非常方便的Class定义,那么Mongoose中的model完全可以用ES6的Class来替换。
class Tag {
constructor(name) {
this.name = name // string
this.createdTime = new Date() // date
}
}
然后,插入到集合中:
const newTag = new Tag('foo')
const tagsColl = database.collection('tags')
await tagsColl.insertOne(newTag)
两者对比,你会发现,mongoose提供了类型,还有索引创建(如上面的unique索引),功能更多,在这一块,mongoose略胜一筹。但接下来,我要说的是他们之间各种API的易用性。
因为mongodb是官方驱动,它的很多API方法和mongo shell
中的用法(包括名称)都是一模一样的,在学习MongoDB的时候,你肯定会需要查阅它的API文档,一旦你熟悉了mongo shell中的用法,你基本就熟悉了mongodb的用法。
但是,mongoose就不一样了,它自己定义了一些API,这些API使用起来和mongo shell中的API差距还挺大,这意味着如果你使用mongoose,你还得学会mongoose中的API用法,这无疑增加了学习成本(有点吃力不讨好)。
小结
每个人都有自己评判的标准,mongoose或许有你喜欢的点,不过,它已经不是我喜欢的风格了。基于以上三个原因,我只能说,mongoose,再见了!