Сохранение записей документов Mongo в CSV + форматирование ISODate

У меня есть данные в коллекции монго под названием «привет». Документы выглядят так:

{ 
name: ..., 
size: ..., 
timestamp: ISODate("2013-01-09T21:04:12Z"), 
data: { text:..., place:...},
other: ...
}

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

Я попытался создать новую коллекцию (hello2), в которой документы имеют только метку времени и текст.

data = db.hello
for i in data:
    try:
        connection.me.hello2.insert(i["data"]["text"], i["timestamp"])
    except:
        print "Unable", sys.exc_info()

Затем я хотел использовать mongoexport:

mongoexport --db me --collection hello2 --csv --out /Dropbox/me/hello2.csv

Но это не работает, и я не знаю, как поступить.

PS: я также хотел бы хранить только время ISODate в файле CSV, то есть просто 21:04:12 вместо ISODate("2013-01-09T21:04:12Z")

Спасибо за помощь.


person Julia    schedule 10.01.2013    source источник


Ответы (1)


Вы можете экспортировать прямо из коллекции данных, нет необходимости во временной коллекции:

for r in db.hello.find(fields=['text', 'timestamp']):
     print '"%s","%s"' % (r['text'], r['timestamp'].strftime('%H:%M:%S'))

или записать в файл:

with open(output, 'w') as fp:
   for r in db.hello.find(fields=['text', 'timestamp']):
       print >>fp, '"%s","%s"' % (r['text'], r['timestamp'].strftime('%H:%M:%S'))

Чтобы отфильтровать дубликаты и распечатать только самые последние, процесс следует разделить на два этапа. Во-первых, накапливаем данные в словаре:

recs = {}
for r in d.foo.find(fields=['data', 'timestamp']):
    text, time = r['data']['text'], r['timestamp']
    if text not in recs or recs[text] < time:
        recs[text] = time

а затем вывести содержимое словаря:

for text, time in recs.items():
    print '"%s","%s"' % (text, time.strftime('%H:%M:%S'))
person georg    schedule 10.01.2013
comment
Спасибо ! Текстовое поле вложено в данные, поэтому следует использовать: db.hello.find(fields=['data.text', 'timestamp']) и % (r['data']['text']... ) ? - person Julia; 10.01.2013
comment
@Julia: я думаю, fields должно быть просто ['data','timestamp']. r['data']['text'] правильно. - person georg; 10.01.2013
comment
есть ли способ отфильтровать дубликаты r['data']['text'], а в случае, когда 2 документа имеют одинаковый текст, сохранить только самый последний? Спасибо! - person Julia; 10.01.2013