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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26366417/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 00:24:20  来源:igfitidea点击:

How to make a query date in mongodb using pymongo?

pythonmongodbpymongonosql

提问by touchmx

I'm trying to perform a query date in mongodb, but the result is always empty. My query is as follows:

我正在尝试在 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) 

//variable resultaMongo return empty.

//变量 resultaMongo 返回空。

Obs: I also tried without using .isoformat() When I put in mongodb directly, only return results if I add ISODate. So does not return results:

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'})

More so if you edit returns:

如果您编辑返回,则更是如此:

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'})

This is a sequence of records in the database:

这是数据库中的一系列记录:

    { "_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" }

if i print the json variable of python, i see something like:

如果我打印 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'}

My Mongndb Class connection is:

我的 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"

采纳答案by Anzel

@Joni is correct, you need to use datetime.

@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'}

clearly I can successfully return results. Perhaps your data is corrupt, or you should post all your code for us to review

显然我可以成功返回结果。也许您的数据已损坏,或者您应该发布所有代码供我们审核

回答by Joni

Query conditions on ISODate attributes should use Python's datetime.datetimeobjects.

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

That is, don't format your dates as strings using the isoformat function, use them as they are.

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

回答by Meet Patel

If start = datetime(2014, 9, 24, 7, 51, 04)is throwing error,

如果start = datetime(2014, 9, 24, 7, 51, 04)抛出错误,

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

尝试使用
start = datetime.datetime(2014, 9, 24, 7, 51, 04).