Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a query date in mongodb using pymongo?

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

//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.

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:

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:

{'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:

#!/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" 
like image 458
touchmx Avatar asked Oct 14 '14 17:10

touchmx


People also ask

How does MongoDB write dates?

You can specify a particular date by passing an ISO-8601 date string with a year within the inclusive range 0 through 9999 to the new Date() constructor or the ISODate() function. These functions accept the following formats: new Date("<YYYY-mm-dd>") returns the ISODate with the specified date.

How does Python store dates in MongoDB?

To insert a record, or document as it is called in MongoDB, into a collection, we use the insert_one() method. The first parameter of the insert_one() method is a dictionary containing the name(s) and value(s) of each field in the document you want to insert.

How is datetime stored in MongoDB?

MongoDB will store date and time information using UTC internally, but can easily convert to other timezones at time of retrieval as needed.


2 Answers

@Joni is correct, you need to use 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

like image 198
Anzel Avatar answered Sep 29 '22 10:09

Anzel


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

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

like image 33
Joni Avatar answered Sep 29 '22 11:09

Joni