5

MongoDB コレクションでドキュメントを検索しようとする単純なコードがあります。Mongoのシェルクライアントでは普通に見つけられるのですが、Node経由では無理で、色々試してみましたがだめでした。

まず、MongoDB 自体からの結果:

raul@rmedina:~$ mongo sdk_back
MongoDB shell version: 2.0.6
connecting to: sdk_back
> db.metadatos.find();
{ "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" }
> db.metadatos.findOne({"tipo":"proceso"});
{ "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" }
> db.metadatos.findOne({tipo:"proceso"});
{ "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" }
> 

ご覧のとおり、find クエリと findOne クエリの両方が機能します。これが私のノードコードです:

    var utils   = require('../utils/utils.js'),
    Server = require('mongodb').Server,
    Db = require('mongodb').Db;

    exports.procesaJSON = function (input_json){
    if(!utils.validaJSON(input_json))
        throw new Error('JSON de entrada inválido!');

    //procesamos
    input_json = JSON.parse(input_json);

    if(typeof(input_json.id) === "undefined")
        throw new Error('JSON de entrada inválido (falta propiedad \"id\"!');

    //obtenemos meta-data de mongo
    var db = new Db("sdk_back", new Server('localhost',27017,{auto_reconnect:true, poolsize:1}),{safe:true});
    db.open(function(err,db){
        if(!err){
            db.collection("metadatos",function(err,collection){
                console.log('Entering collection meta-data');
                if(!err){
                    console.log('Lets find one');
                    collection.findOne({"tipo":"proceso"},function(err,doc){
                        console.log('Results of findOne');
                        if(!err){
                            console.log(doc);
                        }
                        else{
                            throw new Error('Error al buscar meta_data!');
                        }

                        if(doc){
                            console.log('We have results');
                        }
                        else{
                            console.log('We dont have results');
                        }
                    });
                }
                else{
                    throw new Error('Error al buscar meta_data 1!');
                }
            });
        }
        else{
            throw new Error('Error al conectarse a MongoDB!');
        }
        db.close();
    });
};

出力は常に次のようになります。

raul@rmedina:~$ node pu_entrypoint.js 
Entering collection meta-data
Lets find one
raul@rmedina:~$ 

ご覧のとおり、"Results of findOne" というテキストを含むログは表示されないため、findOne メソッドが実際に実行されることはありません。

私の質問は、私が間違っていることは何ですか? コレクションをドロップして再作成し、データベースをドロップし、Mongo の /data/db ディレクトリを変更しましたが、役に立ちませんでした。

私は何を間違っていますか?

ありがとうございました!

[解決済み] 更新: 問題は db.close() にありました。ノードは非同期であり、コレクションの検索に到達する前にデータベースの終わりに到達したため、もちろん何も見つかりませんでした。最後のコールバック内で db.close を移動するだけで、問題は解決しました。編集したコードは次のとおりです。

db.open(function(err,db){
            if(!err){
                db.collection("metadatos",function(err,collection){
                    console.log('Entering collection meta-data');
                    if(!err){
                        console.log('Lets find one');
                        collection.findOne({"tipo":"proceso"},function(err,doc){
                            console.log('Results of findOne');
                            if(!err){
                                if(doc){
                                    console.log('We have results');
                                    console.log(doc._id);
                                }
                                else{
                                    console.log('We dont have results');
                                }
/********** MOVED db.close() HERE ********************/
                                db.close();
                            }
                            else{
                                throw new Error('Error al buscar meta_data!');
                            }
                        });
                    }
                    else{
                        throw new Error('Error al buscar meta_data 1!');
                    }
                });
            }
            else{
                throw new Error('Error al conectarse a MongoDB!');
            }
/********** REMOVED db.close() FROM HERE ********************/
        });
4

1 に答える 1

0

問題は db.close() にあります。ノードは非同期で開始し、コレクションの検索に到達する前にデータベースの終わりに到達したため、もちろん何も見つかりませんでした。最後のコールバック内に db.close を移動すると、問題が解決します。編集したコードは次のとおりです。

    db.open(function(err,db){
        if(!err){
            db.collection("metadatos",function(err,collection){
                console.log('Entering collection meta-data');
                if(!err){
                    console.log('Lets find one');
                    collection.findOne({"tipo":"proceso"},function(err,doc){
                        console.log('Results of findOne');
                        if(!err){
                            if(doc){
                                console.log('We have results');
                                console.log(doc._id);
                            }
                            else{
                                console.log('We dont have results');
                            }
/********** MOVE db.close() HERE ********************/
                            db.close();
                        }
                        else{
                            throw new Error('Error al buscar meta_data!');
                        }
                    });
                }
                else{
                    throw new Error('Error al buscar meta_data 1!');
                }
            });
        }
        else{
            throw new Error('Error al conectarse a MongoDB!');
        }
/********** REMOVED db.close() FROM HERE ********************/
    });
于 2015-04-08T11:50:45.243 に答える