2014-08-28 2 views
14

Во-первых, я совершенно новый для 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)") 
     } 
    } 
}); 
+1

Просто уточнить здесь. Единственная причина, по которой '.getTimeStamp()' терпеть неудачу здесь, состоит в том, что у вас фактически нет объекта ObjectId в поле первичного ключа '_id' в каждом документе. Вы ** должны ** действительно смотреть на это, как если бы MongoDB «позволял» вам смешивать типы в полях, так как это «схематично», вы не должны ** делать это как общую практику и должны действительно исправлять это где это происходит, чтобы сделать записи согласованными. –

+0

Спасибо за это уведомление! Как я уже сказал, я новичок в монго и исхожу из реляционных баз данных. Я все еще не уверен, как создавались эти коллекции и почему у них нет ObjectID. Как вы заявили, мне нужно будет исправить это и понять, почему и как. Благодаря! – cb0

ответ

25

Существует метод 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() чек там для удовлетворения возможных пустых коллекций.

+0

Я бы сказал, что это действительно безопасно делать в среде оболочки, где все вызовы синхронны; это решение в асинхронной среде драйверов является рискованным (многие параллельные запросы в быстрой последовательности). – zamnuts

+0

@zamnuts Существует множество способов безопасного обработки списков и потоков данных в среде async. Вам просто нужно знать обратные вызовы, чтобы объявлять каждую итерацию. Если вы не уверены в этом, вы всегда можете задать вопрос, и кто-то, вероятно, покажет вам, как это сделать. –

+0

это не работает для меня: 'Невозможно вызвать метод 'find' of undefined at ...' mongo version 2.6.6 –

Смежные вопросы