Mongoose find (), как получить доступ к документам результатов?

Я только начал играть с Мангустом и монго. У меня есть следующий код:

var ninjaSchema = mongoose.Schema({
    name: String,
    skill: Number
});

var Ninja = mongoose.model('Ninja',ninjaSchema);

module.exports = {
init : function(){
    console.log('Connecting to database');
    mongoose.connect('mongodb://localhost/mydb');
    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function callback () {
      console.log('Successfully connected!');
    });
},
createNinja : function(name,skill){
    var n = new Ninja({name:name,skill:skill});
    n.save(function(err,n){
        if (err)
            console.log('saving failed');
        console.log('saved '+ n.name);
    });
},
getNinjas : function(){
    var res = null;
    res = Ninja.findOne({},'name skill',function(err,docs){
        if (err)
            console.log('error occured in the query');
        return 'ninja name: '+docs.name+' ninja skill: '+docs.skill;
    });

    return res;
}

нет проблем с добавлением записей в базу данных, но у меня есть проблемы с их получением. Я немного смущен тем, как все это работает. Мое понимание таково:

есть схемы, которые похожи на классы в ООП, поэтому просто схема для записи в базе данных. Модель-это запись, хорошо, может быть, немного больше, так как я видел, что вы можете добавить метод модели. Что ж... Я не очень понимаю, как ими пользоваться. Вы можете дать мне подсказку, что это на самом деле?

назад к теме: при выдаче команды find он вызывает анонимную функцию, и документы должны быть результатом правильно? Как мне получить к ним доступ? С этого момента, если я регистрирую res, я получаю следующее:

{ options: {},
safe: undefined,
_conditions: {},
_updateArg: {},
_fields: { name: 1, skill: 1 },
_geoComparison: undefined,
op: 'findOne',
model: 
{ [Function: model]
 base: 
  { connections: [Object],
    plugins: [],
    models: [Object],
    modelSchemas: [Object],
    options: {} },
 modelName: 'Ninja',
 model: [Function: model],
 db: 
  { base: [Object],
    collections: [Object],
    models: {},
    replica: false,
    hosts: null,
    host: 'localhost',
    port: 27017,
    user: undefined,
    pass: undefined,
    name: 'mydb',
    options: [Object],
    _readyState: 1,
    _closeCalled: false,
    _hasOpened: true,
    _listening: true,
    _events: [Object],
    db: [Object] },
 schema: 
  { paths: [Object],
    subpaths: {},
    virtuals: [Object],
    nested: {},
    inherits: {},
    callQueue: [],
    _indexes: [],
    methods: {},
    statics: {},
    tree: [Object],
    _requiredpaths: [],
    options: [Object],
    _events: {} },
 options: undefined,
 collection: 
  { collection: [Object],
    opts: [Object],
    name: 'ninjas',
    conn: [Object],
    queue: [],
    buffer: false } } }

также, если я использую Ninja.find(...,function(err,docs){ ... }) как мне пройти через документы? Или как мне получить свои записи?

1 ответов


Я нашел ошибку. Это было скорее концептуальное: я имею дело с асинхронными вызовами и пытаюсь вернуть результат из другой функции и не знаю, когда он будет выполняться. Итак, я делаю запрос на выполнение запроса db и возвращаю результат, который оказывается нулевым. Этот код:

getNinjas : function(){
    var res = null;
    Ninja.find({},'name skill',function(err,docs){
        if (err)
            console.log('error occured in the database');
        console.log(docs);
    });     
    return res;
}

возвращает null, но! пульт.log (docs) выводит на консоль все значения из базы данных, что я пытался сделать. Теперь мне нужно сделать изменения, скорее всего, передадут обратный вызов, который будет выполнен по получении результатов.

С изменениями код выглядит так:

getNinjas : function(res){
    var twisted = function(res){
        return function(err, data){
            if (err){
                console.log('error occured');
                return;
            }
            res.send('My ninjas are:\n');
            console.log(data);
        }
    }

    Ninja.find({},'name skill',twisted(res));
}

таким образом, я могу передать объект ответа, чтобы я мог отправить имя моих ниндзя:)