我正在尝试使用Mongoose直接在数据库中保存架构。以下是要在MongoDB中保存的代码(schema.js):
var mongoose = require('mongoose');
var Mixed = mongoose.Schema.Types.Mixed;
var modelSchema = mongoose.Schema({
schemaname:String,
object : Mixed
})
var Model = mongoose.model('Model',modelSchema);
exports.createModel = function(model){
var model_to_create = new Model(model);
console.log("creating a schema..." + model)
model_to_create.save(function(err,data){
console.log("Saving a schema...")
if(err){
return "model creation failed";
}else {
return "model creation success";
}
});
}
我正在使用以下代码创建架构:
var schema = require('../schemas/schema');
var status = schema.createModel({
"username": String,
"firstname": String,
"lastname": String,
"description": String,
"education": String
})
由于某种原因,架构未保存在数据库中。 当我打印“状态”时,我得到“未定义”
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:4)
保存模型是一种异步操作,您必须等到它的回调被调用才能读取结果。一种常见的方法是传递一个在保存完成时调用的函数:
exports.createModel = function(model, callback) {
var model_to_create = new Model(model);
console.log("creating a schema..." + model)
model_to_create.save(function(err,data){
callback(err, data); // <-- called when save is ready
});
};
...
var schema = require('../schemas/schema');
schema.createModel({
"username": String,
"firstname": String,
"lastname": String,
"description": String,
"education": String
}, function(err, data) { // <-- this is the callback you pass
// here you handle the results of saving the model
});
编辑:此外,您的模型只有两个属性(schemaname
和object
),但您将5个属性传递给其构造函数。如果您打算保存每个,则需要单独保存:
schema.createModel({
schemaname : 'username',
object : 'String' // (you probably need to stringify your type, you can't save a class to MongoDB)
}, function(err, data) { ... });
如果您希望/需要在继续之前等待保存所有条目,可以使用async作为协调多个异步操作的方法。
答案 1 :(得分:0)
添加到上一个答案,
保存mongoose数据类型,有一个简单的方法:
将它们保存为字符串。从数据库中检索模式数据时,只需使用mongoose.Schema.Types["String"]
来获取字符串的数据类型。
我有一个类似的用例,我创建了一个简单的递归函数来转换Schema Object中保存在数据库中的Schema数据:
function changeSchemaType(fields) {
var f;
for(key of Object.keys(fields)) {
f = fields[key];
if(f.type && typeof f.type === 'string') {
f.type = mongoose.Schema.Types[f.type]
} else if(Array.isArray(f.type)){
f.type = [mongoose.Schema.Types[f.type[0]]];
} else {
changeSchemaType(f);
}
}
}
该函数还允许在传递时创建类型数组:["String"]
用于类型。
通过示例:
var data = {
data1 : {type : "Number", required : true},
data2 : {type : ["String"]}
}
changeSchemaType(data);
var mySchema = new Schema("mySchema", data)
该函数不处理field : "Mixed"
之类的简写语法,但如果需要,可以对其进行调整。