2013-04-06 6 views
7

私はちょうどマングースとモンゴーで遊んで始めました。私は次のコードを持っています: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; 
} 

データベースへのエントリの追加に問題はありませんが、取得に問題があります。私は、全体の仕組みがちょっと混乱しています。私の理解は次の通りです:

oopのクラスのようなスキーマがあります。したがって、データベースのレコードの青写真だけです。モデルはレコードです.OK、もっと多分、私はあなたがモデルにメソッドを追加できることを知っていました。まあ...私は本当にそれらを使用する方法を理解していません。彼らは本当に何かを手がかりにすることができますか?

件名に戻る:findコマンドを実行すると、匿名関数が呼び出され、ドキュメントは結果として正しく表示されますか?どうすればそれらにアクセスできますか?私は解像度を記録した場合、今ので、私は、次を得る:私はNinja.find(...,function(err,docs){ ... })を使用する場合

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

はまた、どのように私は、ドキュメントを谷に行くのですか?または、私の記録を取り出す方法は?

答えて

15

私はこの欠陥を発見しました。私は非同期呼び出しを処理しており、別の関数から結果を返そうとしていて、いつ実行されるかわからないという概念的なものでした。では、dbクエリが実行され、結果がnullになることを要求するリクエストを行います。このコード:

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

を返します。 console.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)); 
} 

したがって、このように私は私が私の忍者の名前を送信することができますので、レスポンスオブジェクトを渡すことができています:)

+1

ああ:コードは次のようになります変更により

それ。私はあなたのために素敵な答えを仕掛けていましたが、あなたはそれを得ました。結果を送信するコールバックを渡す必要があります。 – numbers1311407

関連する問題