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?


2 回复

当然可以。在使用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();

解释

  1. 定义Schema:首先定义你的Schema。
  2. 动态创建模型:在需要的时候,使用mongoose.connection.model()方法创建模型,并传递动态的集合名称作为第三个参数。
  3. 使用模型:现在你可以像平常一样使用这个模型来进行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创建多个具有不同集合名称的模型实例。

回到顶部