Nodejs中mongodb是Schema無關的,那麼爲什麼要mongoose?

Nodejs中mongodb是Schema無關的,那麼爲什麼要mongoose?

用了mongoose首先就得定義好表結構,也就是Schema,這樣一個Collection裏面各個document的字段都必須相同,這樣豈不是很不方便,倒像是回到了SQL,這就是Mongoose的初衷麼?或者是我理解有誤?

Mongoose的作者說,它在保持文檔靈活性和易改動的前提下,引入了特定的屬性對其做一定的約束,想問下,這個靈活性是如何保持的,我怎麼感覺定義了Schema之後就沒有靈活性了?

6 回复

Nodejs中mongodb是Schema無關的,那麼為什麼要mongoose?

在Node.js开发中,使用MongoDB作为数据库时,很多人会问为什么需要mongoose。因为MongoDB本身是一个schema-less的数据库,这意味着每个文档(document)可以有不同的结构。然而,尽管MongoDB本身没有强制的schema约束,但在实际开发中,我们往往需要一种方式来定义和验证数据结构,以确保数据的一致性和完整性。

Mongoose 是什么?

Mongoose是一个流行的Node.js库,用于处理与MongoDB的交互。它提供了一种简单的方式来定义和操作MongoDB中的数据模型(models)。通过定义一个模式(Schema),我们可以为数据添加一些约束和验证规则,从而提高代码的可读性和可维护性。

为什么需要Mongoose?

  1. 数据验证:Mongoose允许你定义数据的格式和类型,这有助于确保数据的一致性和正确性。
  2. 自动转换:Mongoose可以自动将JavaScript对象转换为MongoDB文档,并进行必要的类型转换。
  3. 中间件支持:Mongoose提供了中间件(middleware)功能,可以在数据保存之前或之后执行自定义逻辑。
  4. 查询简化:Mongoose提供了一些方便的方法来构建复杂的查询。

示例代码

以下是一个简单的示例,展示如何使用Mongoose定义一个用户模型:

const mongoose = require('mongoose');

// 定义一个模式
const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        unique: true,
        required: true
    },
    age: {
        type: Number,
        min: 0
    }
});

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

// 使用模型
async function createUser() {
    try {
        const newUser = new User({
            name: 'John Doe',
            email: 'john@example.com',
            age: 25
        });
        
        await newUser.save();
        console.log('User created:', newUser);
    } catch (error) {
        console.error(error);
    }
}

createUser();

在这个例子中,我们定义了一个userSchema,其中包含三个字段:nameemailage。通过这些定义,我们可以确保每个用户文档都必须包含nameemail字段,并且email必须是唯一的。此外,age字段必须是一个大于等于0的数字。

虽然定义了模式可能会看起来像回到了SQL的世界,但实际上,Mongoose仍然保持了文档的灵活性。你可以随时修改模式,而不需要重新创建整个数据库。这使得Mongoose成为处理复杂数据结构的一个强大工具。


你要明白这么做目的是什么,不是看他怎么说 目的是规范你的DOC 对象,不能乱搞,保存的时候,要做类型检测,那检测原形在那里啊???就是先定义好了 那好,有没有其它方式呢?应该没有了,因为JS是弱类型,它的检测类型必须是强类型,没办法,不管怎么搞都少不了这步,弱转强步聚

嘿嘿,有个看了,觉得这不是多余的吗? 其实你是缺少开发经验,你如果认为这是多余的,那存入的数据是不是乱放? 什么数据才是乱放?答案是垃圾数据

恩啊,又看了一些文檔,大致明白了這樣做的原因,比如便於對數據進行檢查。而且mongoose也提供了less-Schema的方式。謝謝你的回答

Schema Free !== No Schema

Mongoose 是一个 MongoDB 对象模型工具,它让处理数据库变得更加方便和结构化。尽管 MongoDB 本身是 Schema-less 的(即没有强制性的结构),但在实际开发过程中,定义和管理数据结构是非常必要的。这不仅可以提高代码的可读性和可维护性,还可以提供一些额外的功能,如验证、中间件等。

示例代码

假设我们要创建一个用户模型:

const mongoose = require('mongoose');

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

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

module.exports = User;

在这个例子中,我们定义了一个用户模型 User,它包含 nameemailpasswordage 字段,并且指定了每个字段的类型和一些约束条件(如必填项、唯一性、最小值等)。

灵活性与约束

虽然定义了 Schema,但仍然具有灵活性。例如:

  1. 动态添加属性

    • 在 MongoDB 中,你可以随时向文档中添加新的字段,即使这些字段在 Schema 中没有定义。
    const newUser = new User({ name: 'John Doe', email: 'john@example.com' });
    newUser.someNewField = 'some value';
    await newUser.save();
    
  2. 中间件和钩子

    • Mongoose 提供了中间件和钩子(如 prepost 钩子),可以在数据操作前后执行自定义逻辑。
    userSchema.pre('save', function(next) {
        console.log('Before saving the user');
        next();
    });
    
  3. 验证和预处理

    • 通过 Schema 可以定义复杂的验证规则,确保数据的一致性和完整性。
    const addressSchema = new mongoose.Schema({
        street: { type: String, required: true },
        city: { type: String, required: true },
        state: { type: String, required: true },
        zip: { type: String, validate: /^\d{5}$/ }
    });
    

综上所述,Mongoose 既提供了对数据结构的约束,又保留了灵活性,使得开发过程更加高效和可靠。

回到顶部