2015-05-07 2 views
0

У меня была одна проблема, из-за которой у меня была головная боль почти на один день.pymongo query by datetime

скрипты Python являются:

# coding:utf-8 
import pymongo 
import datetime, time 

def query_data(IP,datefrom,dateto): 
    conn = pymongo.MongoClient(IP) 
    db = conn.mymongo 

    startdate = time.mktime(time.strptime(datefrom,'%Y-%m-%d')) 
    enddate = time.mktime(time.strptime(dateto,'%Y-%m-%d')) 

    # all above are correct definitely. 
    # 
    # but I got no result from this line below. 
    cursor = db.find({'username':'test','created':{'$gte':startdate,'$lt':enddate}}) 
    print cursor.count() 
    # with above code, I got 0 returned though I can see it is nonzero in database. 
    # 
    # If I use this below with single datetime, I can see result. But it is not my intention. 
    # cursor = db.find({'username':'test','created':datefrom}) 
    # print cursor.count() 

    tempData = [] 
    for doc in cursor: 
     print doc['twitter'] 
     tempData.append(doc['twitter']) 

    print len(tempData) 
    return tempData 

result = query_data('192.168.100.20','2014-4-1','2014-5-1') 

Вопрос заключается в том, что случилось с моим кодом выше? Или как я могу запрашивать данные из mongoDB между двумя датами, с скриптом pymongo?

+0

В mongodb, datetime должен быть объектом 'ISODate', попробуйте сравнить' new Date (...) 'вместо – Anzel

+0

Я пробовал двумя способами: db.find ({'username': 'test', ' created ': {' $ gte ': new Date (datefrom),' $ lt ': new Date (dateto)}}) и db.find ({' username ':' test ',' created ': {' $ gte ':' new Date (datefrom) ',' $ lt ':' new Date (dateto) '}}) В любом случае результаты не дали мне никаких результатов. Я использовал там неправильный формат? –

+0

Вы пробовали использовать 'datetime.datetime'? – Anzel

ответ

3

Есть 2 проблемы здесь, вы пытаетесь вызвать find на Database объекта, также необходимо запросить с datetime.datetime объекта для $gte и $lt для правильной работы в MongoDB.

def query_data(IP,datefrom,dateto): 
    conn = pymongo.MongoClient(IP) 
    db = conn.mymongo 

    # time.mktime will only return a float point number 
    # what you really need are the datetime.datetime objects 
    startdate = datetime.datetime.strptime(datefrom,'%Y-%m-%d') 
    enddate = datetime.datetime.strptime(dateto,'%Y-%m-%d') 

    # you need to call find method on collection, not database object 
    cursor = db['your_collection'].find({'username':'test','created':{'$gte':startdate,'$lt':enddate}}) 
    print cursor.count() 
    ... 

Я не тестировал его, но он должен работать так, как ожидалось, и надеюсь, что это поможет.

+0

Хорошо, я попробую завтра, когда я нахожусь в офисной комнате. В прошлом году я использовал time.strptime, и я получил данные по мере необходимости. для db ['collection'] здесь, я могу ошибаться. В любом случае, я дам вам знать, буду ли я работать завтра. Спасибо. –

+0

К сожалению, это не решило мою проблему. Я правильно исправляю свой код. Он не возвращает никаких результатов. My pymongo имеет версию 3.0.1. Можете ли вы рассказать мне свою версию pymongo и дать свой результат теста с кодом, пожалуйста? Спасибо. –

+0

@ Victor.Li, вы уверены, что имя пользователя действительно существует в вашей коллекции? Можете ли вы пойти в оболочку mongo и попробовать запросить только 'db.collection.find ({'username': 'test'})' и опубликовать свой результат?Причина использования datetime/time не работает, либо ваши даты, хранящиеся в mongo, не являются точно объектом 'ISODate', или записи не существуют в вашей коллекции. – Anzel