Во-первых, я совершенно новый для mongodb. Вот мой вопрос, который я не смог найти.Прокрутите все коллекции Mongo и выполните запрос
Предположим, у меня есть 3 разных коллекции.
mongos> show collections
collectionA
collectionB
collectionC
Я хочу, чтобы создать скрипт, который перебирает все коллекции IND этой базы данных и найти последнюю вставленную метку времени в каждом из этих коллекций. Вот что работает внутри монго.
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 вар)
Я могу обойти проблему 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 at 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)")
}
}
});
Просто уточнить здесь. Единственная причина, по которой '.getTimeStamp()' терпеть неудачу здесь, состоит в том, что у вас фактически нет объекта ObjectId в поле первичного ключа '_id' в каждом документе. Вы ** должны ** действительно смотреть на это, как если бы MongoDB «позволял» вам смешивать типы в полях, так как это «схематично», вы не должны ** делать это как общую практику и должны действительно исправлять это где это происходит, чтобы сделать записи согласованными. –
Спасибо за это уведомление! Как я уже сказал, я новичок в монго и исхожу из реляционных баз данных. Я все еще не уверен, как создавались эти коллекции и почему у них нет ObjectID. Как вы заявили, мне нужно будет исправить это и понять, почему и как. Благодаря! – cb0