Nodejs mongoose 动态设置collectionName的问题
Nodejs mongoose 动态设置collectionName的问题
假设我定义了一个Schema并导出(伪代码):
var MySchema = new Schema({id:String}); var model = mongoose.model(“MyModel”, MySchema ); module.exports = model;
然后我进行用mongoose进行写入: model.create(doc, /* 我想在这里改变[collectionName]*/,function(error) { if (error) return callback(error); return callback(null); });
然而官方给出的方法是在Schema设置时去定义:
var schema = new Schema({ name: String }, { collection: ‘actor’ });
// or
schema.set(‘collection’, ‘actor’);
// or
var collectionName = 'actor’ var M = conn.model(‘Actor’, schema, collectionName)
请教各位大神如何在model.create时去设置collectionName?
当然可以。在使用Mongoose时,你可能会遇到需要动态设置集合名称(collection name)的情况。默认情况下,Mongoose会根据模型名称自动生成集合名称(通常是模型名称的复数形式)。但有时候,你可能希望在运行时动态地更改集合名称。
解决方案
你可以通过修改Mongoose的模型实例来实现这一点。虽然不能直接在model.create()
方法中设置集合名称,但可以通过其他方式达到目的。一种常见的方法是使用mongoose.connection.model()
方法,在运行时创建模型,并指定动态的集合名称。
示例代码
假设你有一个名为User
的Schema,并且你想在运行时动态地更改集合名称:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// 定义一个简单的Schema
const UserSchema = new Schema({
name: String,
email: String
});
// 导出Schema
module.exports = UserSchema;
// 在另一个文件中使用
const UserSchema = require('./path/to/UserSchema');
const collectionName = 'dynamicCollectionName'; // 动态的集合名称
// 使用连接对象创建模型,并指定动态的集合名称
const userModel = mongoose.connection.model('User', UserSchema, collectionName);
async function createDocument() {
try {
const doc = {
name: 'John Doe',
email: 'john.doe@example.com'
};
await userModel.create(doc);
console.log(`Document created in ${collectionName}`);
} catch (error) {
console.error('Error creating document:', error);
}
}
createDocument();
解释
- 定义Schema:首先定义你的Schema。
- 动态创建模型:在需要的时候,使用
mongoose.connection.model()
方法创建模型,并传递动态的集合名称作为第三个参数。 - 使用模型:现在你可以像平常一样使用这个模型来进行CRUD操作。
这种方法允许你在运行时动态地更改集合名称,而不需要在定义Schema时就固定下来。
在Mongoose中,mongoose.model()
方法中的集合名称是在创建模型时静态定义的。如果你想在运行时动态地更改集合名称,你需要使用mongoose.connections
对象来获取当前连接,并通过连接对象创建模型。
以下是如何在model.create
时动态设置集合名称的示例代码:
const mongoose = require('mongoose');
const { Schema } = mongoose;
// 定义一个Schema
var MySchema = new Schema({ id: String });
// 导出函数以便在运行时动态创建模型
module.exports = function dynamicCollectionName(collectionName) {
// 获取默认的MongoDB连接
const connection = mongoose.connections[0];
// 如果你有多个数据库连接,可以通过mongoose.connection对象访问
// const connection = mongoose.connection;
// 使用动态的集合名称创建模型
var Model = connection.model('MyModel', MySchema, collectionName);
// 返回模型
return Model;
};
使用上述函数时,你可以这样调用它:
const dynamicModel = dynamicCollectionName('myDynamicCollection');
dynamicModel.create(doc, function(error) {
if (error) return callback(error);
return callback(null);
});
这种方法允许你在运行时为同一个Schema创建多个具有不同集合名称的模型实例。