まず、私は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)")
}
}
});
_
これを行う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()
チェックインも必要です。