在带有pymong的mongodb上插入$currentDate

2024-05-19 03:06:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要测试服务器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()

Tags: fromimportselfobjdbdatetimedefconnection
3条回答

感谢所有帮助我的人。我现在明白了,先插入,然后更新。像这样:

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

这样我就可以检查发送查询的时间和在远程服务器上执行查询的时间。 现场主机我有以下输出,例如:

2014-11-08 15:37:45.079000

2014年11月1日15:38:04.039000

2014年11月2日15:38:05.410000

2014年11月3日15:38:06.785000

2014年11月4日15:38:08.153000

2014年11月5日15:38:09.522000

2014年11月6日15:38:10.886000

2014年11月7日15:38:12.243000

2014年11月8日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的时间之间的时差。注意:时钟是同步的。

MongoDB中的运算符表达式在数据结构中表示为字符串。这些也是“更新运算符”,因此^{}应该用于^{}方法的“更新对象”部分。

所以像这样从服务器插入带有“$currentDate”的新记录:

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

当然,你的收藏品里什么都没有。否则,请确保.update()语句的“query”部分与要按原样“insert/”upsert“的文档不匹配。

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

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

你应该像这样把python代码传递给mongo

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

您的代码:

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

相关问题 更多 >

    热门问题