Цикл через все коллекции 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. Задача (перебирать все коллекции)
есть ли возможность к СТХ. как.
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: false при src / mongo / shell / query.js: 124
кажется, что last_element не сохраняется правильно.
любые предложения о том, что я делаю неправильно??
обновление
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's not empty
if (last_element.hasNext()) {
// print its timestamp
printjson(last_element.next()._id.getTimestamp());
}
})
вы, вероятно, также хотите .hasNext()
регистрация там, чтобы удовлетворить возможные пустые коллекции.