2014-11-08 2 views
1

Мне нужно проверить точность сервера mongodb. Я пытаюсь вставить последовательность данных, взять момент, и он был отправлен в базу данных, чтобы узнать, когда он был вставлен. Я пробовал это:

#!/usr/bin/python 
from pymongo import Connection 
from datetime import date, timedelta, datetime 

class FilterData: 

@classmethod 
def setData(self, serialData): 
    try: 
     con = Connection('IP_REMOTE', 27017, safe=True) 
     db = con['resposta']    
     inoshare = db.resposta 
     inoshare.insert(serialData)    
     con.close() 

    except Exception as e: 
     print "Erro no filter data: ", e.message, e.args 

obj = FilterData() 
inicio = datetime.now() 
termino = inicio + timedelta(seconds=10) 
contador = 1 

while inicio <= termino: 
    print contador, inicio.strftime('%d-%m-%Y %H:%M:%S') 
    pacote = {'contador':contador, 'datahora':$currentDate()} 
    obj.setData(pacote) 
    contador += 1 

Но переменные mongodb (используя $) не распознаются в python. Как продолжить эту интеграцию?

Obs: IP_REMOTE = мой действительный IP на удаленном сервере

затем попытался следующие, но вставляет только одну запись.

#!/usr/bin/python 
from pymongo import Connection 
from datetime import date, timedelta, datetime 
import time 

class FilterData: 

    def __init__(self): 
     self.con = Connection('54.68.148.224', 27017, safe=True) 
     self.db = self.con['resposta']    
     self.inoshare = self.db.resposta 

    def setData(self, serialData): 
     try: 

      self.inoshare.update({}, serialData, upsert=True)    

     except Exception as e: 
      print "Erro no filter data: ", e.message, e.args 

    def desconect(self): 
     self.con.close() 

obj = FilterData() 
inicio = datetime.now() 
termino = inicio + timedelta(seconds=30) 

while inicio <= termino: 
    print inicio.strftime('%d-%m-%Y %H:%M:%S') 
    pacote = {'$currentDate': {'datahora': { '$type': 'date' }}} 
    obj.setData(pacote) 
    inicio = datetime.now() 
    time.sleep(1) 

obj.desconect() 

ответ

4

выражения оператора в MongoDB представлены в структуре данных в виде строки. Это также «операторы обновления», поэтому $currentDate предназначен для использования в части «объект обновления» метода .update().

Так что-то вроде этого, чтобы вставить новую запись с «$ CurrentDate» с сервера:

db = con['resposta']    
inoshare = db.resposta 
inoshare.update({}, { 
    '$currentDate': { 
     'datahora': { '$type': 'date' } 
    } 
},upsert=True) 

условии, конечно, нет ничего в вашей коллекции. В противном случае убедитесь, что «query» часть инструкции .update() не соответствует документу, если вы хотите «вставить»/«upsert» как есть.

Все варианты документации на страницах руководства MongoDB относятся к нотации JSON, относящейся к оболочке MongoDB, но, однако, это не отличается от обозначения многих языков, типично типизированных, таких как python, ruby ​​и Perl.

BTW. Если вы не являетесь действительно тестируете в разных сценариях, то не делайте соединение и не отсоединяйте до и после каждой операции. Коллекции баз данных должны оставаться открытыми для жизненного цикла вашего приложения.

+0

Я сделал это как указано, но удаленная база данных только вставлена ​​в одну запись. Вам нужно вставить ту же сумму, поэтому я могу сравнить временную метку. Только тогда я узнаю, сколько времени потребуется банку для вставки кортежа @Neil – touchmx

+0

@touchmx. Вы можете «обновить» несколько записей с помощью опции «multi», как описано в методе '.update()'. Возможно, вы недопонимаете, что '$ currentDate' делает. Обновленная временная метка будет отражать фактическое время, когда запись была обновлена. Если вы предоставили установленную дату от клиента, то ** все ** обновленные записи будут иметь одну и ту же метку времени. С '$ currentDate', то они, скорее всего, не будут. –

1

Вы должны передать код питона в Монго, как это,

>>> from datetime import datetime 
>>> datetime.now() 

Ваш код:

pacote = {'contador':contador, 'datahora':datetime.now()} 
+0

Извините, забыли ввести код, что сервер удален. с 'now()' Я получаю время от локальной машины. Мне нужен момент, который вставляется в базу данных. – touchmx

+0

Я думаю, что в этом случае используйте временный пояс удаленного сервера сервера 'pytz'. – dhana

+1

@dhana. Подробнее о MongoDB, а не о коде python. Оператор [** '$ currentDate' **] (http://docs.mongodb.org/manual/reference/operator/update/currentDate/) является специальным, который устанавливает дату на основе того, что означает« время сервера », на самом деле есть. Таким образом, без передачи даты, определенной кодом, на сервер. Именно об этом спрашивал ОП. Все остальное происходит от «клиента», даже если вы «должны» синхронизировать время в хорошей практике. –

0

Спасибо всем, кто мне помог. Теперь я понимаю, сначала сделайте вставку, а затем обновление. Например:

class FilterData: 

    def __init__(self): 
     self.con = Connection('IP_REMOTE', 27017, safe=True) 
     self.db = self.con['resposta']    
     self.inoshare = self.db.resposta 
     self.contador = 1 

    def setData(self, serialData): 
     try: 

      self.inoshare.insert({'contador': self.contador}, serialData, upsert=True)  
      print self.contador, datetime.now().strftime('%d-%m-%Y %H:%M:%S.%f') 
      self.inoshare.update({'contador': self.contador}, serialData, upsert=True) 
      self.contador += 1 

     except Exception as e: 
      print "Erro no filter data: ", e.message, e.args 

    def desconect(self): 
     self.con.close() 

Таким образом, я могу проверить время отправки запроса и момент ее выполнения на удаленном сервере. На месте хост У меня есть следующий выход, например:

1 08-11-2014 15: 37: 45,079000

1 08-11-2014 15: 38: 04,039000

2 08-11-2014 15: 38: 05,410000

3 08-11-2014 15: 38: 06,785000

4 08-11-2014 15:38:08.153000

5 08-11-2014 15: 38: 09,522000

6 08-11-2014 15: 38: 10,886000

7 08-11-2014 15: 38: 12,243000

8 08-11-2014 15: 38: 13,609000

И на удаленном сервере, я получаю следующий вывод:

{ "Контадор": 1, "datahora": И.С. Odate ("2014-11-08T18: 38: 05.323Z")}

{ "Контадор": 2, "datahora": ISODate ("2014-11-08T18: 38: 06.687Z")}

{"contador": 3, "datahora": ISODate ("2014-11-08T18: 38: 08.060Z")}

{"contador": 4, "datahora": ISODate ("2014-11- 08T18: 38: 09.429Z ")}

{" Контадор»: 5, "datahora": ISODate ("2014-11-08T18: 38: 10.796Z")}

{ "Контадор": 6 , "datahora": ISODate ("2014-11-08T18: 38: 12.162Z")}

{ "Контадор": 7, "datahora": ISODate ("2014-11-08T18: 38: 13.527Z")}

{ "Контадор": 8, "datahora": ISODate ("2014 -11-08T18: 38: 14.893Z ")}

Таким образом, я могу определить разницу во времени между временем обновления и моментом, когда он действительно был iserido в базе данных. Примечание: Часы синхронизированы.

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