在 Mongoose 中,通常我们是通过定义一个 Schema
来指定集合中文档的结构,这样既可以确保数据的一致性,也方便开发者理解和操作数据库。然而,在某些情况下,我们可能需要在不定义 schema 的情况下执行操作,Mongoose 提供了这样的灵活性,通过所谓的“不严格”模式或者使用 mongoose.model
和 mongoose.connection
对象来直接操作。
如果想在不定义 schema 的情况下执行 Mongoose 指令,可以采用以下方法:
使用不严格模式的 Schema
即使你定义了一个 Schema,你也可以设置它为“不严格”模式,在这个模式下,Mongoose 不会限制数据的结构,允许存储任何形状的文档。
javascriptconst mongoose = require('mongoose'); const { Schema } = mongoose; // 定义一个不严格的 Schema const anySchema = new Schema({}, { strict: false }); const AnyModel = mongoose.model('AnyCollection', anySchema); // 现在你可以存储任何形状的文档 const anyDocument = new AnyModel({ any: { thing: 'you want' } }); anyDocument.save();
使用 mongoose.model
和 mongoose.connection
对象
另外,你也可以不定义 Schema 而直接使用 mongoose.model
和 mongoose.connection
对象进行操作。
javascriptconst mongoose = require('mongoose'); // 连接到数据库 mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true }); // 直接获取 Model,注意这里不需要定义 Schema const AnyModel = mongoose.model('AnyCollection', new mongoose.Schema({}, { strict: false })); // 通过 Model 创建并保存一个新文档 AnyModel.create({ any: { thing: 'you wish' } }, function (err, result) { if (err) throw err; // 执行一些其他操作 }); // 直接使用 mongoose.connection 对象操作数据库 const collection = mongoose.connection.collection('anycollection'); collection.insertOne({ anything: 'you want' }, function (err, result) { if (err) throw err; // 插入成功后的操作 });
在这些例子中,我们没有为 AnyCollection
定义 Schema,而是利用 Mongoose 提供的机制来执行操作。
不过需要注意的是,虽然这种方法提供了灵活性,但它也有缺点。没有 Schema 的 Mongoose 模型无法利用 Mongoose 提供的很多内置功能,如验证、中间件、静态方法等。此外,无法确保数据的一致性,这可能会导致一些意外的行为和难以调试的问题。所以在开发中应当权衡利弊,并在确实需要灵活性时才考虑不定义 Schema。