Mongoose动态mongodb集合名称

3
我正在使用node.js上的mongoose驱动程序来操作mongodb。我有以下模式:
当使用db.model时,可以获取硬编码集合名称“aggregation”的模型。这很有效。
但是如何使用具有动态按需集合名称的模式/模型呢?基本上,我需要按需定义一个新的集合,并使用相同的模式。
aggregationmodel.js
var mongoose    = require('mongoose');

var db = mongoose.createConnection(configfile.mongodb.uriAggregation);

var aggregationSchema = mongoose.Schema({

    factorname   : { type: String, index: true },
    active       : { type: Boolean},

    total   : [{
            _id : { type: Number, index: true },
            ordervolume : Number,
            ordertips : Number,
            ordernationality : String,
            ordercancelled : Number
           }
          ]    
});

module.exports = db.model('aggregation', aggregationSchema, 'aggregation');

controller.js(此文件引用了模型)

var Aggregates     = require('../models/aggregationmodel.js');

哪一部分让你感到困难?您可以使用相同的模式与多个模型。只需再次调用 db.model,并使用不同的模型和集合名称即可。 - JohnnyHK
从controller.js文件中,我如何将参数(集合名称)传递给aggregationmodel.js文件? - LAX_DEV
你不需要这样做。你需要改变你的方法,导出模型和模式或者一个使用该模式创建新模型的函数。 - JohnnyHK
1个回答

3

您所需要做的就是实例化一个“新”模型,并将所需的集合作为参数传递。这只是一个范围的问题,如果模式可用,则可以使用它。但是,您始终可以从现有模型中获取模式并在新实例中使用:

var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/modtest');

var testSchema = new Schema({},{ strict: false });

var Test = mongoose.model( "Test", testSchema, "test" );


mongoose.connection.on("open", function(err,conn) {

  var ReModel = mongoose.model( "Redo", Test.schema, "redo" );

  var redo = new ReModel({ "a": 1 });

  redo.save(function(err,doc) {
    if (err) throw err;
    console.log( doc );
    console.log( "done" );
  });


});

这里的结果是,实际文档被插入到与你从其他模型实例中提取的模式相关联的模型所连接的集合中。

在你的实现中,你真正需要做的就是相同的事情,并将所需的集合作为参数提供给标准实例创建方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接