Nodejs 有无适合mongodb的带schema特性的框架呢?

Nodejs 有无适合mongodb的带schema特性的框架呢?

之前是用compoundjs,最近因为compoundjs数据库层不稳定的原因,切换到了geddy,但是不论之前还是现在,数据库的使用一直是很原始的,mongodb的文档特性完全被放弃了。

现在是不是必须从express开始,才能使用mongodb的文档特性,一旦用了schema,就必须放弃文档特性呢?

现在有没有二者兼备的model呢?

9 回复

Node.js 中适合 MongoDB 的带 Schema 特性的框架

在 Node.js 开发中,如果你希望利用 MongoDB 的文档特性,同时又能享受类似关系型数据库的 schema 定义功能,可以考虑一些优秀的库。最著名的两个选择是 MongooseMongorito

Mongoose

Mongoose 是一个非常流行且成熟的库,它不仅提供了强大的 schema 功能,还支持丰富的验证、中间件等功能。虽然有些人认为它会牺牲部分 MongoDB 的灵活性,但 Mongoose 提供了强大的类型检查和数据验证能力。

示例代码:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });

const userSchema = new mongoose.Schema({
    name: { type: String, required: true },
    age: { type: Number, min: 18 },
    email: { type: String, unique: true }
});

const User = mongoose.model('User', userSchema);

// 创建新用户
const newUser = new User({ name: 'Alice', age: 25, email: 'alice@example.com' });
newUser.save()
    .then(() => console.log('User created'))
    .catch(err => console.error(err));

// 查询用户
User.findOne({ name: 'Alice' })
    .then(user => console.log(user))
    .catch(err => console.error(err));

Mongorito

Mongorito 是另一个轻量级的选择,它保持了 MongoDB 的灵活性,并提供了一些 schema 验证的功能。它更接近原生的 MongoDB API,对于需要更多控制的应用来说可能更适合。

示例代码:
const Mongorito = require('mongorito');

const User = Mongorito.Model.extend({
    initialize() {
        this.addValidator('name', value => value.length > 0);
        this.addValidator('age', value => value >= 18);
    }
});

// 创建新用户
const newUser = new User({ name: 'Bob', age: 30 });
newUser.save()
    .then(() => console.log('User created'))
    .catch(err => console.error(err));

// 查询用户
User.findOne({ name: 'Bob' })
    .then(user => console.log(user))
    .catch(err => console.error(err));

总结

  • Mongoose 提供了强大的 schema 定义和验证功能,适合大型项目。
  • Mongorito 则更轻量级,保持了 MongoDB 的灵活性,适合需要更多控制的应用。

你可以根据项目的具体需求选择合适的库,从而在保持 MongoDB 文档特性的同时,也能享受到 schema 带来的便利。


schema 可以以文档存在MongoDB的collection里面。

比如,如果需要一个文档内的一对多数组

{
   _id: "joe",
   name: "Joe Bookreader",
   addresses: [
                {
                  street: "123 Fake Street",
                  city: "Faketon",
                  state: "MA",
                  zip: 12345
                },
                {
                  street: "1 Some Other Street",
                  city: "Boston",
                  state: "MA",
                  zip: 12345
                }
              ]
 }

有没有支持这样的Schema的呢

我指的是node.js的持久化层的库,现在似乎支持定义模型的,都只能定义兼容SQL的表格模型,不能定义mongodb那种树状的文档模型。

以这种嵌套对象的方式来实现树状结构,插入是很方便,但是它的更新和查询却是非常的麻烦

谢谢回复。看来必须从express开始了,geddy的model停留在传统DB的数据表层次,还没那么先进。

对于你的问题,答案是肯定的。你可以使用一些现代的、功能丰富的框架或库来实现这一点,比如Mongoose。

Mongoose

Mongoose是一个专门为MongoDB设计的对象数据建模(ODM)库,它提供了一种非常方便的方式来定义模式(Schema),并且保留了MongoDB的文档特性。Mongoose允许你在模式中定义字段类型、验证规则等,并且可以很方便地进行CRUD操作。

示例代码

const mongoose = require('mongoose');

// 连接到MongoDB数据库
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义一个Schema
const userSchema = new mongoose.Schema({
    name: { type: String, required: true },
    email: { type: String, required: true, unique: true },
    age: { type: Number, min: [18, 'Too young!'] }
});

// 创建一个Model
const User = mongoose.model('User', userSchema);

// 使用Model进行CRUD操作
async function createUser() {
    const newUser = new User({ name: 'John Doe', email: 'john.doe@example.com', age: 25 });
    await newUser.save();
    console.log('User created:', newUser);
}

async function findUser() {
    const user = await User.findOne({ email: 'john.doe@example.com' });
    console.log('User found:', user);
}

createUser();
findUser();

解释

  1. 连接到MongoDB:首先需要安装mongoose并连接到MongoDB数据库。
  2. 定义Schema:使用mongoose.Schema定义一个模式,模式中可以定义字段及其属性,如必填项、最小值等。
  3. 创建Model:基于定义的Schema创建一个Model,Model用于与数据库进行交互。
  4. CRUD操作:使用Model提供的方法进行增删改查操作,如save()用于创建新文档,findOne()用于查找文档。

结论

使用Mongoose,你可以在Node.js项目中充分利用MongoDB的文档特性,同时也能享受带有Schema定义的好处。这样,你既能够定义出结构化的数据模型,又能保持MongoDB灵活的数据存储方式。

回到顶部