4

MongoDB の設定コレクションから特定の値を取得しようとする関数があります。設定コレクション内の設定値を含む設定オブジェクトのマーカーは {'settings':'settings'} です。スキーマは次のとおりです。

collection:setting
|--object
   |--{'settings':'settings'}
   |--{'valueA':'valueA'}
   |--...

問題は、設定オブジェクトを初めてクエリしたときに、コレクション「設定」が単に存在しないことです。そう、

exports.getInstruments = function (callback) {
db.collection("settings", function(error, settings) {
    settings.find({ "settings" : "settings" }), (function(err, doc) {
           callback(doc.instruments);
    }); 
]);  
}

ハングするだけで、コールバックは呼び出されません。コレクションが存在しない場合は、"" または undefined を返す必要があります。それ以外の場合は、doc.instrumens.

4

3 に答える 3

9

exists()ハングするコードを実行するかどうかを決定するために使用できる関数があります。

> db.getCollection('hello').exists()
null
> db.getCollection('world').exists()
{ "name" : "testdb.world" }
于 2013-06-06T16:18:01.050 に答える
3

db.createCollectionコレクションを明示的に作成することを利用できる可能性があります。

> db.createCollection("asd")
{ "ok" : 1 }
> db.createCollection("asd")
{ "errmsg" : "collection already exists", "ok" : 0 }

ok フィールドに基づいて、コマンドが成功したかどうかを確認するだけです。

于 2012-11-15T11:13:29.557 に答える
2

新しいコレクションのケースを特別に処理する必要はありません。問題はコードにあると思います。

いくつかの構文の問題は別として、主な問題は、最初に一致したドキュメントではなく、コールバック関数にfinda を渡すことです。Cursorドキュメントが 1 つだけ必要な場合は、findOne代わりに使用する必要があります。

これはうまくいくはずです:

exports.getInstruments = function (callback) {
    db.collection("settings", function(error, settings) {
        settings.findOne({ "settings" : "settings" }, function(err, doc) {
            callback(doc && doc.instruments);
        });
    });
};
于 2012-11-15T13:43:14.953 に答える