2015-11-25 2 views
1

У меня есть поле, 'date', которое я беру из документа. Поле date имеет следующее значение: "01.01.2014".дата сохранения в mongodb с использованием python

Я сохраняю это поле в базу данных Монго, как это:

"date" : "01.01.2014", 

Если я разделить эти параметры у меня есть:

year ='2014' 
month ='01' 
day ='01' 

Я хочу сохранить это поле соответствующего типа, как DateTime так как я могу сохранить его с помощью этих параметров?

ответ

0

Используйте модуль datetime

ваш объект дата будет сохранен в MongoDB будет

myDateObject = datetime.datetime(year,month,day, 0 , 0) 

myDateObject использовать для хранения в качестве значения даты ключа в MongoDB.

Здесь ожидается год, месяц и день.

Как и в вашем вопросе, вы также можете использовать поле даты, чтобы преобразовать его в дату и время python. Предполагая, что дата в формате MM.DD.YYYY код для преобразования даты в объект даты и времени является,

>>> datetime.datetime.strptime(date,"%m.%d.%Y") 
datetime.datetime(2014, 1, 1, 0, 0) 
-1

Вы бы по существу нужно использовать Bulk API, где вы можете перебрать своей коллекции, чтобы воспользоваться преимуществами использования команды записи Bulk API, которые позволяют выполнять операции массового обновления, которые являются просто абстракциями на вершине сервера, чтобы упростить сбор объемных операций.

В массовом обновлении вы будете отправлять операции на сервер партиями 1000, что дает вам лучшую производительность, поскольку вы не отправляете каждый запрос на сервер всего один раз в каждые 1000 запросов. «Массовый API» на самом деле сортирует это для вас несколько, но на самом деле вы хотите «управлять» этим немного лучше и не потреблять слишком много памяти в своем приложении. В реальном преобразовании вам нужен метод strptime() для преобразования строки в дату и время. Следующий пример (непроверенный) показывает это понятие:

from datetime import datetime 

client = MongoClient(host, port) 
db = client[database] 
coll = db[collection] 
bulk = coll.initialize_ordered_bulk_op() 
counter = 0 
date_format = "%d.%m.%Y" 

for i, entry in enumerate(collection.find()): 
    if entry.date: 
     if type(entry.date) is not datetime: 
      # process in bulk 
      # convert date string value first 
      time = datetime.strptime(entry.date, date_format) 
      bulk.find({ '_id': entry._id }).update({ '$set': { 'date': time } }) 

      counter++ 

      if (counter % 1000 == 0): 
       bulk.execute() 
       bulk = coll.initialize_ordered_bulk_op() 

if (counter % 1000 != 0): 
    bulk.execute() 
+0

Как это ответить на вопрос? в этом вопросе нет ничего общего. – shx2

+0

@ shx2 Спасибо за ввод. Несмотря на то, что OP явно не упоминает ничего о массивном ориентированном решении, ответ, который я предоставил, учитывает это, поскольку OP хочет обновить текущие поля до нужного типа, например, datetime, а массовый API упрощает такие операции, если это делается массовым. Без этого обновления будут выполняться в цикле for, а это означает, что вы отправляете «каждый» запрос на сервер, тогда как с массивным API его раз в каждые 1000 запросов. Так что, по существу, это до OP, чтобы «управлять» этим немного лучше. – chridam

+0

Как я вижу, вам не хватает сути вопроса. нигде в вопросе он ничего не сказал об обновлении более одного документа. – shx2

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