2014-11-08 42 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 

但是,在python中不能識別mongodb的變量(使用$)。如何着手完成這一整合?

觀測數據: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

操作表達式中的數據結構的字符串表示。這些也是「更新運營商」,因此$currentDate意在用於.update()方法的「更新對象」部分。

因此,像這樣插入一個新的記錄與「$的currentdate」從服務器:

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

當然假設沒有什麼您的收藏。否則,請確保當您想要「插入」/「upsert」時,.update()語句的「查詢」部分與文檔不匹配。

MongoDB手冊頁中的所有文檔選項都是作爲與MongoDB shell相關的JSON表示法,但是這與許多dyamically類型的語言(如python,ruby和Perl)的表示法沒有什麼不同。

順便說一句。除非你是真的在不同的腳本中測試,那麼不要在每次操作之前和之後建立連接並斷開連接。數據庫集合應該在應用程序的生命週期中保持開放。

+0

我按照指示做了,但遠程數據庫只插入一條記錄。需要它插入相同的數量,所以我可以比較時間戳。只有這樣我才能知道銀行需要多長時間插入一個元組@Neil – touchmx 2014-11-08 17:49:47

+0

@touchmx您可以使用'.update()'方法中記錄的「multi」選項來「更新」多個記錄。也許你誤解了'$ currentDate'。更新的時間戳將反映記錄更新的實際時間。如果您從客戶端提供了設定的日期,則所有**更新的記錄將共享相同的時間戳。使用'$ currentDate',那麼他們可能不會。 – 2014-11-09 01:06:48

1

您應該通過Python代碼蒙戈這樣,

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

您的代碼:MongoDB中

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

對不起,忘了把代碼放在服務器是遠程的。 'now()'我從本地機器獲得時間。我需要插入到數據庫中的時刻。 – touchmx 2014-11-08 05:30:44

+0

我想在這種情況下使用'pytz'模塊相關的遠程服務器時區。 – dhana 2014-11-08 05:35:32

+1

@dhana這是關於使用MongoDB比Python代碼更多。 [**'$ currentDate' **](http://docs.mongodb.org/manual/reference/operator/update/currentDate/)操作符是一個特殊的操作符,它根據「服務器時間」實際上是。因此,不要將代碼確定的日期傳遞給服務器。這是OP所要求的。其他任何東西都來自「客戶」,即使您「應該」在良好實踐中同步時間。 – 2014-11-08 06:18:44

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() 

那樣我可以檢查查詢發送的時間以及她在遠程服務器上執行的時刻。 現場主機I具有以下輸出,例如:

1 2014年8月11日15:37:45.079000

1 2014年8月11日15:38:04.039000

2 2014年8月11日15:38:05.410000

3 2014年8月11日15:38:06.785000

4 2014年8月11日15時38分08秒。153000

5 2014年8月11日15:38:09.522000

6 2014年8月11日15:38:10.886000

7 2014年8月11日15:38:12.243000

8 2014年8月11日15:38:13.609000

和遠程服務器我得到以下輸出上:

{ 「康塔」:1, 「datahora」:IS大館( 「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時刻之間的時間差。 注意:時鐘同步

相關問題