如果想要在NodeJS中连接MongoDB,可以选择直接使用mongodb为NodeJS写的驱动包,但我更推荐使用一个比较成熟的中间件:Mongoose。
Mongoose 官方给出了这样的定义:
Mongoose: elegant mongodb object modeling for node.js
Mongoose:优雅地在NodeJS中进行MongoDB对象建模
Let’s face it, writing MongoDB validation, casting and business logic boilerplate is a drag. That’s why we wrote Mongoose.
我们开发Mongoose是因为(开发者)写MongoDB的验证机制、类型转换与业务逻辑模板很麻烦。
(译注:所以Mongoose想简化这些步骤,使得MongoDB更加易用、安全、稳定。)
Mongoose provides a straight-forward, schema-based solution to model your application data. It includes built-in type casting, validation, query building, business logic hooks and more, out of the box.
针对为应用数据建模的问题,Mongoose 提供了一套直白的,基于模式的解决方案。包括了内建的类型转换、验证器、查询构造器、业务逻辑钩子等。
(译注:钩子是指事件式编程中留给开发者编程的事件函数,如“当新增XXX后触发事件”,也称为触发器Trigger)
MongoDB自身的数据格式是BSON,有基本的类型体系。Mongoose在其上针对业务需求,实现了更多的类型,以及用户自定义类,这使得数据建模变得更加灵活。
由于MongoDB是一种Schema-less的数据库——它允许在一个集合中存在各式各样不同形状的文档。这样的异质性在存在人机交互的系统中并不完全是一件好事。恶意(或者手残)的用户可能很容易就能在你的数据库里面注入一些其他与本系统不相关的数据。
因此,对数据的验证(Validation)就很重要,而在数据库底层支持这些又很麻烦,因为验证逻辑可能是很复杂而且可能会依赖于数据库之外的东西。
所以,在数据入库之前就对数据进行验证以保证数据模式的一致性是比较靠谱的做法,Mongoose有比较完善的验证机制,用户可以非常方便地编写自定义验证函数来适应各种需要。
查询构造器是一个构造MongoDB查询语句的东西,本质上是字符串拼接。但它做了更多的事情来防止被SQL注入,利用prepare机制来防止恶意用户通过注入点做一些奇奇怪怪的事情。
另外,构造器的设计对面向对象编程的程序员来说非常友好。
其实我更喜欢用触发器(Trigger)来描述它。
Mongoose对MongoDB底层的触发器做了一层封装,可以用事件驱动事件。
如:“当新建一个文档后,做一件事”这样的需求,可以用Mongoose来管理这样一个逻辑。
Mongoose的地位是位于MongoDB与NodeJS之间的,看上去是增加了一些复杂度,但实际上却做了很多抽象,大大简化了使用MongoDB的难度。
在学习MongoDB的时候,Mongoose也是一个很好的参考资料。