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: 我觉得我这个名字起得还是挺好的。


11 回复

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 比有什么好处?

[@russj](/user/russj)

主要是 mongoose 的一些小问题让我觉得很不爽,比如没办法将一个 Schema 的一部分定义成另一个 Scheme; 以及不能自由地在 document 上添加 Schema 里没有的属性(不保持到数据库,只是为了更方便地向 view 传递数据)

比如没办法将一个 Schema 的一部分定义成另一个 Scheme

是说Schema吧?这个可以的 https://www.npmjs.com/package/mongoose-schema-extend

不能自由地在 document 上添加 Schema 里没有的属性(不保持到数据库,只是为了更方便地向 view 传递数据)

这个功能写一个mongoose插件应该也可以实现

不过支持楼主重复创造轮子亲手操作下,这样才能对有些实现细节更加清晰的掌握

[@andyhu](/user/andyhu) 是这样的(这是我和别人的聊天记录):

我可以这么写

Account = mongoose.Schema
  tokens: [
    Token
  ]

但是为什么不能这么写呢:

Account = mongoose.Schema
  xxoo: 
    type: Token

报错:

 Did you try nesting Schemas? You can only nest using refs or arrays.

或者还有什么其他办法可以把 Token 嵌入为 Account 的一部分,而不是重复写一遍 Token 里的内容。

Node.js:造了一个 mongoose 的迷你轮子:Mabolo

如果你正在寻找一种轻量级的方式来操作 MongoDB 数据库,并且希望有一些自定义功能,那么 Mabolo 可能是一个不错的选择。它是一个简化版的 mongoose,旨在提供一些基本的数据模型和操作功能。

GitHub 链接

你可以在这里找到 Mabolo 的源码和文档:

目前实现的功能

  1. 创建一个 Model 并关联到一个集合

    • 可以在 Model 上定义静态方法。
    • 也可以为 Model 的实例(document)定义实例方法。
  2. 将数据库请求排队直到成功连接到 MongoDB

    • 这有助于确保在连接建立之前不会发生任何数据库操作。
  3. 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();

尚未实现的功能

  1. 不支持在已有 document 上调用 save 方法

    • 目前 Mabolo 不支持直接在已有文档上调用 save 方法。计划实现一个类似于 mongoose 的 __v 字段来避免冲突。
  2. 数据验证

    • 目前 Mabolo 不会依据创建 Model 时定义的 schema 对数据进行验证。计划实现一个基于中间件的验证机制,类似于 mongoose。
  3. 更好的关系系统

    • 目前 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));

功能简析

  1. 创建模型:通过 Model 函数创建模型,第一个参数是模型名称,第二个参数是定义模型结构的 Schema
  2. 定义字段:在 Schema 中定义字段类型和约束,如 requiredunique
  3. 静态方法:可以在模型上定义静态方法,例如 create 用于插入新文档。
  4. 实例方法:可以在模型实例上定义实例方法,例如 save 用于保存修改后的文档。
  5. 请求排队:当尝试操作数据库但尚未连接时,请求会被自动排队并等待连接成功后执行。

未来功能规划

  • 数据验证:计划引入基于中间件的数据验证机制,类似于 Mongoose 的方式。
  • 模型关系:增强模型之间的关系处理能力,支持嵌入式和引用式关系。
  • 兼容性改进:例如增加对已有文档上的 save 方法的支持,并引入一个特殊字段防止冲突。

总结

Mabolo 是一个轻量级的 MongoDB ORM,适合需要简单数据库操作的小型项目。虽然功能相对基础,但它提供了可扩展的基础,并且易于理解和使用。

回到顶部