使用pymongo在mongodb上插入$ currentDate

时间:2014-11-08 05:17:55

标签: python mongodb mongodb-query pymongo

我需要测试服务器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的变量(使用$)。如何进行这种整合?

Obs:IP_REMOTE = 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()

3 个答案:

答案 0 :(得分:4)

MongoDB中的运算符表达式在数据结构中表示为字符串。这些也是&#34;更新运算符&#34;,因此$currentDate旨在用于&#34;更新对象&#34; .update()方法的一部分。

所以像这样用&#34; $ currentDate&#34;插入一条新记录。来自服务器:

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

当然假设您的收藏中没有任何内容。否则请确保&#34;查询&#34;当您想要&#34;插入&#34; /&#34; upsert&#34;时,.update()语句的一部分与文档不匹配原样。

MongoDB手册页中的所有文档选项都是与MongoDB shell相关的JSON符号,但是这与许多动态类型语言(如python,ruby和Perl)的符号没有什么不同。

顺便说一句。除非您真的在不同的脚本中进行测试,否则不要在每次操作之前和之后建立连接和断开连接。数据库集合应该在应用程序的生命周期中保持打开状态。

答案 1 :(得分:1)

你应该将python代码传递给像这样的mongo,

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

您的代码:

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

答案 2 :(得分: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

在远程服务器上,我得到以下输出:

{“contador”:1,“datahora”:ISODate(“2014-11-08T18:38:05.323Z”)}

{“contador”: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”)}

{“contador”:5,“datahora”:ISODate(“2014-11-08T18:38:10.796Z”)}

{“contador”:6,“datahora”:ISODate(“2014-11-08T18:38:12.162Z”)}

{“contador”:7,“datahora”:ISODate(“2014-11-08T18:38:13.527Z”)}

{“contador”:8,“datahora”:ISODate(“2014-11-08T18:38:14.893Z”)}

通过这种方式,我可以确定更新时间与数据库中真正的iserido时刻之间的时差。 注意:时钟已同步