2013-04-07 2 views
0

Я пытаюсь сохранить схему непосредственно в БД, используя Mongoose. Вот код (schema.js), чтобы сохранить в MongoDB:Сохранить схемы в БД, используя Mongoose

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

По какой-то причине, схема не сохраняется в БД. Когда я печатаю «статус», я получаю «undefined»

Может ли кто-нибудь помочь мне, как я могу решить эту проблему?

ответ

3

Сохранение модели - это асинхронная операция, вам нужно подождать, пока не будет вызван обратный вызов, прежде чем вы сможете прочитать результаты. Обычный способ сделать это, чтобы передать функцию, которая будет вызвана, когда экономия будет сделано:

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

EDIT: также, ваша модель имеет только два свойства (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 как способ координации мультипликатор асинхронные операции.

+0

Большое спасибо. Но проблема заключается в сохранении ** данных TYPES **, таких как String, Number и т. Д. Непосредственно в MongoDB. Я не уверен, есть ли какая-нибудь работа для этой проблемы. – codejammer

+0

Спасибо @robertklep. Для такого приложения, которое я пытаюсь построить, Mongoose только наносит вред, чем benifit. Ограничения схемы стали серьезной проблемой, и я решил отказаться от mongoose и пойти с mongojs, который является легкой оболочкой поверх собственного драйвера с меньшими ограничениями, чтобы развязать гибкость NOSQL – codejammer

0

, чтобы добавить к предыдущему ответу, , чтобы сохранить данные о материалах мангуста, есть простой способ: сохранить их как строку. при возврате данных схемы из базы данных вам просто нужно использовать mongoose.Schema.Types["String"], чтобы получить данные. Типы строк.

У меня был подобный случай использования, и я создал простую рекурсивную функцию для преобразования данных схемы, сохраненные в базе данных в схеме объекта:

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) 

функция не обрабатывает стенограмму syntaxe как field : "Mixed", но она может быть адаптирована к тому, если это необходимо.