我需要测试服务器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()
答案 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时刻之间的时差。 注意:时钟已同步 。