Python 如何使用pymongo在mongodb中查询日期?

Python 如何使用pymongo在mongodb中查询日期?,python,mongodb,pymongo,nosql,Python,Mongodb,Pymongo,Nosql,我试图在mongodb中执行查询日期,但结果总是空的。 我的质询如下: //in the begin code def __init__(self): self.now = datetime.now() self.db = conexaoMongo() self.horaInicio = self.now - timedelta(minutes=1) def resultadoConsulta(self, modo, porta, id_node): #prin

我试图在mongodb中执行查询日期,但结果总是空的。 我的质询如下:

//in the begin code
def __init__(self):
    self.now = datetime.now()
    self.db = conexaoMongo()
    self.horaInicio = self.now - timedelta(minutes=1)

def resultadoConsulta(self, modo, porta, id_node):
    #print "Porta e No ", porta, id_node
    resultadoMongo = []
    mediaFinal = False      
    try:

        json = {'id_no': int(id_node), 'datahora': {'$gte': self.horaInicio, '$lt': self.now}, 'porta': porta}

        print "COnsulta a ser realizada: ", json
        resultadoMongo = self.db.queryMongoOne(json) 
//变量resultaMongo返回空

Obs:我也尝试了不使用.isoformat()的方式 当我直接输入mongodb时,只有在添加ISODate时才返回结果。 因此不返回结果:

db.inoshare.find( {'id_no': 1, 'datahora': {'$lte': '2014-09-24T07:52:04.945306', '$gte': '2014-09-24T07:51:04.958496'}, 'porta': 'A0'})
如果您编辑退货,情况会更糟:

db.inoshare.find( {'id_no': 1, 'datahora': {'$lte': ISODate('2014-09-24T07:52:04.945306'), '$gte': ISODate('2014-09-24T07:51:04.958496')}, 'porta': 'A0'})
这是数据库中的一系列记录:

    { "_id" : ObjectId("5435be9ce7b9916e02ed2cb5"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:05Z"), "valor" : "917", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2cb9"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:07Z"), "valor" : "932", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2cbd"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:09Z"), "valor" : "189", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2cc1"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:11Z"), "valor" : "853", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2cc5"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:13Z"), "valor" : "202", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2cc9"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:15Z"), "valor" : "398", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2ccd"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:17Z"), "valor" : "947", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2cd1"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:19Z"), "valor" : "57", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2cd5"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:21Z"), "valor" : "395", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2cd9"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:23Z"), "valor" : "941", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2cdd"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:25Z"), "valor" : "208", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2ce1"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:27Z"), "valor" : "186", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2ce5"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:29Z"), "valor" : "848", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2ce9"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:31Z"), "valor" : "571", "sensor" : "1" }
    { "_id" : ObjectId("5435be9ce7b9916e02ed2ced"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:33Z"), "valor" : "351", "sensor" : "1" }
    { "_id" : ObjectId("5435be9de7b9916e02ed2cf1"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:35Z"), "valor" : "558", "sensor" : "1" }
    { "_id" : ObjectId("5435be9de7b9916e02ed2cf5"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:37Z"), "valor" : "449", "sensor" : "1" }
    { "_id" : ObjectId("5435be9de7b9916e02ed2cf9"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:39Z"), "valor" : "768", "sensor" : "1" }
    { "_id" : ObjectId("5435be9de7b9916e02ed2cfd"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:41Z"), "valor" : "542", "sensor" : "1" }
    { "_id" : ObjectId("5435be9de7b9916e02ed2d01"), "lab" : "2", "porta" : "A0", "id_no" : 1, "datahora" : ISODate("2014-09-24T07:51:43Z"), "valor" : "763", "sensor" : "1" }
如果我打印python的json变量,我会看到如下内容:

{'id_no': 1, 'datahora': {'$gte': datetime.datetime(2014, 9, 24, 8, 21, 38, 527653), '$lt': datetime.datetime(2014, 9, 24, 8, 22, 36, 677022)}, 'porta': 'A1'}
我的Mongndb类连接是:

#!/usr/bin/python
from pymongo import MongoClient

class conexaoMongo:

    def __init__(self):
        self.conditions = []        
        self.client = MongoClient("127.0.0.1", 27017, safe=True)
        self.db = self.client['inoshare']
        self.ino = self.db.inoshare     


    def queryMongo(self, param1, param2=None, param3=None): 

        try:
            if param2 != None:
                results = self.ino.find(param1, param2)
            elif param3 != None:
                results = self.ino.find(param1, param2, param3)
            else:               
                results = self.ino.find(param1)

            #print "Total de registros ", results.count()

            for post in results:
                #print post
                self.conditions.append(post)

            return self.conditions

        except:
            print "Erro ao executar a query"

ISODate属性的查询条件应该使用Python的
datetime.datetime
对象


也就是说,不要使用isoformat函数将日期格式化为字符串,按原样使用。

@Joni是正确的,您需要使用
datetime

from datetime import datetime
from pymongo import Connection

# i have updated and included the complete code 
client = Connection('localhost', 27017)
db = client['database'] # your database name
inoshare = db['inoshare']


# convert your date string to datetime object
start = datetime(2014, 9, 24, 7, 51, 04)
end = datetime(2014, 9, 24, 7, 52, 04)

inoshare.find( {'id_no': 1, 'datahora': {'$lt': end, '$gte': start}, 'porta': 'A0'})
<pymongo.cursor.Cursor at 0x7f9aafd64a90>

inoshare.find_one( {'id_no': 1, 'datahora': {'$lt': end, '$gte': start}, 'porta': 'A0'})

{u'_id': ObjectId('5435be9ce7b9916e02ed2cb5'),
 u'datahora': datetime.datetime(2014, 9, 24, 7, 51, 5),
 u'id_no': 1.0,
 u'lab': u'2',
 u'porta': u'A0',
 u'sensor': u'1',
 u'valor': u'917'}
从日期时间导入日期时间
从pymongo导入连接
#我已经更新并包含了完整的代码
客户端=连接('localhost',27017)
db=client['database']#您的数据库名称
inoshare=db['inoshare']
#将日期字符串转换为datetime对象
开始=日期时间(2014、9、24、7、51、04)
结束=日期时间(2014、9、24、7、52、04)
find({'id_no':1,'datahora':{'$lt':end,$gte':start},'porta':'A0'})
inoshare.find_one({'id_no':1,'datahora':{'lt':end,$gte':start},'porta':'A0'})
{u''id':ObjectId('5435be9ce7b9916e02ed2cb5'),
u'datahora':datetime.datetime(2014,9,24,7,51,5),
u'id_no':1.0,
u'lab':u'2',
u'porta':u'A0',
u'sensor':u'1',
u'valor':u'917'}
显然,我可以成功地返回结果。 可能您的数据已损坏,或者如果
start=datetime(2014,9,24,7,51,04)
抛出错误,您应该发布所有代码供我们查看

尝试使用

start=datetime.datetime(2014,9,24,7,51,04)

我也尝试过使用datetime.datetime,但没有结果。没有任何结果意味着没有文档匹配所有条件。这是一个正确的想法,但看,我会在帖子中添加一个记录列表。开始的示例:datetime(2014,9,24,8,32,37,745578);end的示例:datetime(2014,9,24,8,33,37731647);没有结果。啊,我明白了,你用
ISODate
存储日期,你需要在它们之间进行转换,因为通常在mongo上
date
存储为
date
object我已经编辑过将datetime转换为isoformat,你能测试一下这是否有效吗?你的意思是
datetime.datetime(2014,9,24,7,51,04)。isoformat()
不工作?好的,这次很清楚。首先,您不需要重复
results=results
,简化代码,只需使用
test=conexaoMongo()进行测试;results=test.queryMongo({…,{'$gte':datetime(…),'$lt':datetime(…)})
现在测试了这个,但它不起作用。而且你的
json
字典是错误的,你不能访问
self
外部的
\uuuuu init\uuu
,你可以把
self.json={…}
并将
self.json
作为参数传递。我在帖子中打印了json变量的内容。到目前为止,我只能提供帮助。有了我们的答案(和代码),我希望您能纠正代码中的错误。很明显,参数传递不正确。通过一些更改,您应该能够获得我向您展示的
结果。祝你好运似乎OP尝试了
datetime.datetime
,请参阅