我有一个更新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)
我只接受第二次方法通话 如果有人有解决方案,请告诉我。
答案 0 :(得分:40)
我设法解决了这个问题:
var Admin;
if (mongoose.models.Admin) {
Admin = mongoose.model('Admin');
} else {
Admin = mongoose.model('Admin', adminSchema);
}
module.exports = Admin;
答案 1 :(得分:24)
我认为你已经在同一个架构上实例化了mongoose.Model()
两次。您应该只创建一次每个模型并拥有一个全局对象,以便在需要时获取它们
我假设您在目录$YOURAPP/models/
$YOURAPPDIR/models/
- index.js
- A.js
- B.js
index.js
module.exports = function(includeFile){
return require('./'+includeFile);
};
A.js
module.exports = mongoose.model('A', ASchema);
B.js
module.exports = mongoose.model('B', BSchema);
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(.....
答案 2 :(得分:8)
我尽量避免使用全局变量,因为所有内容都是通过引用来实现的,而事情可能会变得混乱。我的解决方案
model.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);
}
}
答案 3 :(得分: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;
答案 4 :(得分:2)
实际上问题不在于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);
}
答案 5 :(得分:0)
这是因为在两个路径中需要一个模型。
//评论模型文件
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')