web-dev-qa-db-ja.com

すべてのMongoコレクションをループしてクエリを実行する

まず、私はmongodbにかなり慣れていません。ここに私が解決策を見つけることができなかった私の質問があります。

3つの異なるコレクションがあるとします。

_mongos> show collections
collectionA
collectionB
collectionC
_

このデータベースとすべてのコレクションを反復処理して、これらの各コレクションで最後に挿入されたタイムスタンプを見つけるスクリプトを作成したいと思います。 mongos内で機能するのは次のとおりです。

_var last_element = db.collectionA.find().sort({_id:-1}).limit(1);
printjson(last_element.next()._id.getTimestamp());
ISODate("2014-08-28T06:45:47Z")
_

1。問題(すべてのコレクションに対して繰り返す)

Sthする可能性はありますか?お気に入り。

_var my_collections = show collections;
my_collections.forEach(function(current_collection){
    print(current_collection);
});
_

ここでの問題は、_my_collections_の割り当てが機能しないことです。 _SyntaxError: Unexpected identifier_を取得します。 「show」ステートメントを引用する必要がありますか?それも可能ですか?

2。問題(js varにコレクションを保存)

これを行うことで問題1を回避できます。

_var my_collections = ["collectionA", "collectionB", "collectionC"];
my_collections.forEach(function(current_collection){
    var last_element = db.current_collection.find().sort({_id:-1}).limit(1);
    print(current_collection);
    printjson(last_element.next()._id.getTimestamp());
});
_

last_element.next()は、次のエラーを生成します。

エラーhasNext:src/mongo/Shell/query.js:124でfalse

Last_elementが正しく保存されていないようです。

私が間違っていることについての提案はありますか?


[〜#〜]更新[〜#〜]

ニールズの答えは私をこの解決策に導きます。彼のコードに加えて、関数getTimestampが実際に存在するかどうかを確認する必要がありました。一部の「仮想」コレクションでは、_idプロパティがないようです。

_db.getCollectionNames().forEach(function(collname) {
    var last_element = db[collname].find().sort({_id:-1}).limit(1);
    if(last_element.hasNext()){
        var next = last_element.next();
        if(next._id !== undefined && typeof next._id.getTimestamp == 'function'){
           printjson(collname + " >> "+next._id.getTimestamp());
        }else{
          print(collname + " undefined!! (getTimestamp N/A)")
        }
    }
});
_
21
cb0

これを行うdb.getCollectionNames()ヘルパーメソッドがあります。その後、コードを実装できます。

_db.getCollectionNames().forEach(function(collname) {
    // find the last item in a collection
    var last_element = db[collname].find().sort({_id:-1}).limit(1);
    // check that it's not empty
    if (last_element.hasNext()) {
        // print its timestamp
        printjson(last_element.next()._id.getTimestamp());
    }
})
_

空のコレクションの可能性に対応するために、おそらく.hasNext()チェックインも必要です。

43
Neil Lunn