Nodejs 有无适合mongodb的带schema特性的框架呢?
Nodejs 有无适合mongodb的带schema特性的框架呢?
之前是用compoundjs,最近因为compoundjs数据库层不稳定的原因,切换到了geddy,但是不论之前还是现在,数据库的使用一直是很原始的,mongodb的文档特性完全被放弃了。
现在是不是必须从express开始,才能使用mongodb的文档特性,一旦用了schema,就必须放弃文档特性呢?
现在有没有二者兼备的model呢?
Node.js 中适合 MongoDB 的带 Schema 特性的框架
在 Node.js 开发中,如果你希望利用 MongoDB 的文档特性,同时又能享受类似关系型数据库的 schema 定义功能,可以考虑一些优秀的库。最著名的两个选择是 Mongoose 和 Mongorito。
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那种树状的文档模型。
mogoose http://mongoosejs.com/index.html
以这种嵌套对象的方式来实现树状结构,插入是很方便,但是它的更新和查询却是非常的麻烦
mogoose
谢谢回复。看来必须从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();
解释
- 连接到MongoDB:首先需要安装
mongoose
并连接到MongoDB数据库。 - 定义Schema:使用
mongoose.Schema
定义一个模式,模式中可以定义字段及其属性,如必填项、最小值等。 - 创建Model:基于定义的Schema创建一个Model,Model用于与数据库进行交互。
- CRUD操作:使用Model提供的方法进行增删改查操作,如
save()
用于创建新文档,findOne()
用于查找文档。
结论
使用Mongoose,你可以在Node.js项目中充分利用MongoDB的文档特性,同时也能享受带有Schema定义的好处。这样,你既能够定义出结构化的数据模型,又能保持MongoDB灵活的数据存储方式。