Прокрутите все коллекции Mongo и выполните запрос

Во-первых, я довольно новичок в mongodb. Здесь мой вопрос, на который я не смог найти решение.

Скажем, у меня есть 3 разных коллекции.

mongos> show collections
collectionA
collectionB
collectionC

Я хочу создать script, который перебирает все коллекции этой базы данных и находит последнюю вставленную метку времени в каждой из этих коллекций. Вот что работает внутри монго.

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. Нужно ли цитировать выражение "показать"? Возможно ли это?

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() вызывает следующую ошибку:

error hasNext: false в src/mongo/shell/query.js: 124

Кажется, что last_element не сохранен правильно.

Любые предложения о том, что я делаю неправильно?


UPDATE

Ответы Neils приводят меня к этому решению. В дополнение к его коду мне пришлось проверить, действительно ли существует функция 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)")
        }
    }
});

Ответы

Ответ 1

Существует вспомогательный метод 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 not empty
    if (last_element.hasNext()) {
        // print its timestamp
        printjson(last_element.next()._id.getTimestamp());
    }
})

Вероятно, вам также нужна проверка .hasNext() для обслуживания возможных пустых коллекций.