25

我有一个通用的方法来更新 MongoDB 中任何集合的文档吗?

以下代码在文件名Deleter.js 中

module.exports.MongooseDelete = function (schemaObj, ModelObject);
{
  var ModelObj = new mongoose.Model("collectionName",schemaObj);
  ModelObj.remove(ModelObject);
}

并在我的主文件app.js中调用如下:

var ModObj = mongoose.model("schemaName", schemasObj);
var Model_instance = new ModObj();
var deleter = require('Deleter.js');
deleter.MongooseDelete(schemasObj,Model_instance);

我收到以下错误:

OverwriteModelError: Cannot overwrite `undefined` model once compiled.
    at Mongoose.model (D:\Projects\MyPrjct\node_modules\mongoose\lib\index.js:4:13)

我只进行第二种方法调用。如果有人有解决方案,请告诉我。

4

7 回答 7

49

我设法解决了这样的问题:

var Admin;

if (mongoose.models.Admin) {
  Admin = mongoose.model('Admin');
} else {
  Admin = mongoose.model('Admin', adminSchema);
}

module.exports = Admin;
于 2014-10-06T13:39:19.863 回答
33

我认为您已经mongoose.Model()在同一架构上实例化了两次。您应该只创建每个模型一次,并在需要时拥有一个全局对象来获取它们

我假设您在目录下的不同文件中声明不同的模型$YOURAPP/models/

$YOURAPPDIR/models/
 - index.js
 - A.js
 - B.js

index.js

module.exports = function(includeFile){
    return require('./'+includeFile);
};

js

module.exports = mongoose.model('A', ASchema);

B.js

module.exports = mongoose.model('B', BSchema);

在你的 app.js

APP.models = require('./models');  // a global object

当你需要它时

// Use A
var A = APP.models('A');
// A.find(.....

// Use B
var B = APP.models('B');
// B.find(.....
于 2013-03-06T14:28:00.027 回答
10

我尽量避免使用全局变量,因为一切都是参考,事情可能会变得混乱。我的解决方案

模型.js

  try {
    if (mongoose.model('collectionName')) return mongoose.model('collectionName');
  } catch(e) {
    if (e.name === 'MissingSchemaError') {
       var schema = new mongoose.Schema({ name: 'abc });
       return mongoose.model('collectionName', schema);
    }
  }
于 2013-11-02T18:21:23.450 回答
4

实际上问题不在于mongoose.model()实例化了两次。问题是Schema实例化了不止一次。例如,如果您执行mongoose.model("Model", modelSchema)n 次并且您使用的是对 Schema 的相同引用,这对 mongoose 来说不是问题。当您在同一模型上使用另一个模式引用时,问题就出现了,即

var schema1 = new mongoose.Schema(...);
mongoose.model("Model", schema1);
mongoose.model("Model", schema2);

这是发生此错误时的情况。

如果您查看源代码,(mongoose/lib/index.js:360)这是检查

if (schema && schema.instanceOfSchema && schema !== this.models[name].schema){
    throw new mongoose.Error.OverwriteModelError(name);
}
于 2016-05-23T22:45:37.157 回答
3

我发现最好避免全局和异常处理-

var mongoose = require("mongoose");
var _ = require("underscore");

var model;
if (_.indexOf(mongoose.modelNames(), "Find")) {
    var CategorySchema = new mongoose.Schema({
        name: String,
        subCategory: [
            {
                categoryCode: String,
                subCategoryName: String,
                code: String
            }
        ]
    }, {
        collection: 'category'
    });
    model = mongoose.model('Category', CategorySchema);
}
else {
    model = mongoose.model('Category');
}


module.exports = model;
于 2014-02-10T14:22:55.073 回答
1

这是因为在两条路径中需要一个模型。

// 注释模型文件

var mongoose = require('mongoose')
var Schema = mongoose.Schema

var CommentSchema = Schema({
  text: String,
  author: String
})

module.exports = mongoose.model('Comment', CommentSchema)

// 种子文件

const commentData = {
  user: "David Lee",
  text: "This is one comment"
}
var Comment = require('./models/Comment')

module.exports = function seedDB () {
  Comment.create(commentData, function (err, comment) {
    console.log(err, commemt)
  })
}

// 索引文件

var Comment = require('./models/comment')
var seedDB = require('./seeds')
seedDB()
const comment = {
  text: 'This girl is pretty!',
  author: 'David'
}
Comment.create(, function (err, comment) {
    console.log(err, comment)
 })

现在你会得到throw new mongoose.Error.OverwriteModelError(name),因为你需要以两种不同的方式评论模型。种子文件var Comment = require('./models/Comment'),索引文件var Comment = require('./models/comment')

于 2018-03-12T02:58:02.047 回答
0

我的解决了这个代码:

  module.exports = mongoose.models.nameOne || mongoose.model('nameOne', PostSchema);
于 2021-11-26T10:27:51.853 回答