1

我正在尝试使用 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
})

由于某种原因,架构没有保存在数据库中。当我打印 "status" 时,我得到 "undefined"

谁能帮我解决这个问题?

4

2 回答 2

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
});

编辑:另外,您的模型只有两个属性(schemanameobject),但您将 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作为协调多个异步操作的一种方式。

于 2013-04-07T12:22:46.003 回答
0

添加到前面的答案,保存猫鼬数据类型,有一个简单的方法:将它们保存为字符串。从数据库中检索模式数据时,您只需要使用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"]for type 创建类型数组。

例如:

var data = {
    data1 : {type : "Number", required : true},
    data2 : {type : ["String"]}
}
changeSchemaType(data);
var mySchema = new Schema("mySchema", data)

该函数不处理类似的简写语法field : "Mixed",但如果需要,它可以适应。

于 2017-05-23T17:16:33.773 回答