Nodejs:造了一个 mongoose 的迷你轮子:Mabolo
Nodejs:造了一个 mongoose 的迷你轮子:Mabolo
https://github.com/jysperm/Mabolo
目前实现的功能:
- 创建一个 Model 并关联到一个集合,可以在 Model 上定义静态方法,也可以为 Model 的实例(document)定义实例方法
- 将数据库请求排队直到成功连接到 MongoDB
- findById 系列方法
尚未实现的功能:
- 还不支持在已有的 document 上调用 save 方法,需要实现一个类似 mongoose 的
__v
来防止出现冲突 - 目前实际上目前并不会依据创建 Model 时定义的 schema 对数据进行验证,准备实现一个基于中间件(和 mongoose 类似)的验证机制
- 实现一个比 mongoose 更好的关系系统,来定义 Model 之间的嵌入关系或引用关系
PS: 我觉得我这个名字起得还是挺好的。
what’s the meaning of Mabolo?
要是有个 update的middleware就好了
验证器的部分已经写完了~
https://github.com/jysperm/Mabolo/compare/v0.1.3…v0.2.0 Mabolo 0.2 发布了,目前在嵌入式文档的支持方面已经接近 Mongoose了
为什么要这个轮子? 和 Mongoose 比有什么好处?
主要是 mongoose 的一些小问题让我觉得很不爽,比如没办法将一个 Schema 的一部分定义成另一个 Scheme; 以及不能自由地在 document 上添加 Schema 里没有的属性(不保持到数据库,只是为了更方便地向 view 传递数据)
比如没办法将一个 Schema 的一部分定义成另一个 Scheme
是说Schema吧?这个可以的 https://www.npmjs.com/package/mongoose-schema-extend
不能自由地在 document 上添加 Schema 里没有的属性(不保持到数据库,只是为了更方便地向 view 传递数据)
这个功能写一个mongoose插件应该也可以实现
不过支持楼主重复创造轮子亲手操作下,这样才能对有些实现细节更加清晰的掌握
Node.js:造了一个 mongoose 的迷你轮子:Mabolo
如果你正在寻找一种轻量级的方式来操作 MongoDB 数据库,并且希望有一些自定义功能,那么 Mabolo 可能是一个不错的选择。它是一个简化版的 mongoose,旨在提供一些基本的数据模型和操作功能。
GitHub 链接
你可以在这里找到 Mabolo 的源码和文档:
目前实现的功能
-
创建一个 Model 并关联到一个集合
- 可以在 Model 上定义静态方法。
- 也可以为 Model 的实例(document)定义实例方法。
-
将数据库请求排队直到成功连接到 MongoDB
- 这有助于确保在连接建立之前不会发生任何数据库操作。
-
findById
系列方法- 提供了方便的方法来根据 ID 查找文档。
示例代码
假设你有一个用户模型(User),可以这样定义:
const Mabolo = require('mabolo');
// 创建一个与 "users" 集合关联的 User 模型
const User = new Mabolo.Model({
collection: 'users',
fields: {
name: String,
email: String,
age: Number
}
});
// 定义静态方法
User.statics.findByName = function(name) {
return this.collection.findOne({ name });
};
// 定义实例方法
User.methods.greet = function() {
console.log(`Hello, my name is ${this.name}`);
};
// 使用静态方法
User.findByName('John Doe')
.then(user => {
if (user) {
user.greet();
} else {
console.log('User not found');
}
})
.catch(err => {
console.error(err);
});
// 使用实例方法
const newUser = new User({ name: 'Jane Doe', email: 'jane@example.com', age: 25 });
newUser.greet();
尚未实现的功能
-
不支持在已有 document 上调用
save
方法- 目前 Mabolo 不支持直接在已有文档上调用
save
方法。计划实现一个类似于 mongoose 的__v
字段来避免冲突。
- 目前 Mabolo 不支持直接在已有文档上调用
-
数据验证
- 目前 Mabolo 不会依据创建 Model 时定义的 schema 对数据进行验证。计划实现一个基于中间件的验证机制,类似于 mongoose。
-
更好的关系系统
- 目前 Mabolo 还没有实现一个完善的模型间关系系统,计划实现一个更强大的关系系统来定义嵌入关系或引用关系。
总结
Mabolo 是一个轻量级的 MongoDB 操作库,虽然功能上不及 mongoose 全面,但适合那些希望在 Node.js 中使用 MongoDB 时能够拥有更多自定义空间的开发者。希望未来版本能够实现更多的功能,使其更加完善。
Mabolo 是一个模仿 Mongoose 的迷你轮子,旨在简化与 MongoDB 数据库的交互。它实现了创建模型、静态方法、实例方法、请求排队等功能,并且计划在未来版本中增强数据验证和模型关系管理。
示例代码
假设你想要创建一个名为 User
的模型,你可以这样做:
const { Model, Schema } = require('mabolo');
const mabolo = require('mabolo');
// 定义 User 模型的 Schema
const userSchema = new Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true }
});
// 创建 User 模型
const User = Model('User', userSchema);
// 使用静态方法
User.create({ name: 'John Doe', email: 'john@example.com' })
.then(user => console.log(user))
.catch(err => console.error(err));
// 使用实例方法
const newUser = new User({ name: 'Jane Doe', email: 'jane@example.com' });
newUser.save()
.then(savedUser => console.log(savedUser))
.catch(err => console.error(err));
// 查找特定用户
User.findById('12345')
.then(user => console.log(user))
.catch(err => console.error(err));
功能简析
- 创建模型:通过
Model
函数创建模型,第一个参数是模型名称,第二个参数是定义模型结构的Schema
。 - 定义字段:在
Schema
中定义字段类型和约束,如required
和unique
。 - 静态方法:可以在模型上定义静态方法,例如
create
用于插入新文档。 - 实例方法:可以在模型实例上定义实例方法,例如
save
用于保存修改后的文档。 - 请求排队:当尝试操作数据库但尚未连接时,请求会被自动排队并等待连接成功后执行。
未来功能规划
- 数据验证:计划引入基于中间件的数据验证机制,类似于 Mongoose 的方式。
- 模型关系:增强模型之间的关系处理能力,支持嵌入式和引用式关系。
- 兼容性改进:例如增加对已有文档上的
save
方法的支持,并引入一个特殊字段防止冲突。
总结
Mabolo 是一个轻量级的 MongoDB ORM,适合需要简单数据库操作的小型项目。虽然功能相对基础,但它提供了可扩展的基础,并且易于理解和使用。