2014-11-18 2 views
1

Мой MongoDB документ выглядит следующим образом: -Получение данных из MongoDB на основе даты в состоянии PyMongo

{ 
    "_id" : 111, 
    "ts" : [ 
    ISODate("2010-08-21T23:13:35.000Z"), 
    ISODate("2011-08-23T09:13:10.000Z"), 
    ISODate("2012-08-26T12:55:51.000Z"), 
    ISODate("2010-08-29T03:11:12.000Z") 
] 
} 

{ 
    "_id" : 112, 
    "ts" : [ 
    ISODate("2010-08-21T23:13:35.000Z"), 
    ISODate("2011-08-23T09:13:10.000Z"), 
    ISODate("2012-08-26T12:55:51.000Z"), 
    ISODate("2010-08-29T03:11:12.000Z") 
] 

}

Каждая запись дата указывает на «хит». Я пытаюсь подсчитать количество обращений к каждому идентификатору за определенный период.

запрос выглядит следующим образом: -

db.pgview.aggregate 
({$match:{ts:{$elemMatch:{$gte:ISODate("2012-09-01"),$lte:ISODate("2014-09-01")}}}}, 
{$unwind:"$ts"}, 
{$match:{ts:{$gte:ISODate("2012-09-01"),$lte:ISODate("2014-09-01")}}}, 
{$group:{_id:"$_id",count:{$sum:1}}}) 

Это прекрасно работает на Монго Shell. Но я пытаюсь извлечь то же самое из Python, для которого я не получаю никаких значений. Код Python: -

def __init__(self): 

    self.conn = pymongo.MongoClient()["test"] 
    self.coll = self.conn.pgview 
    self.stDate = datetime.datetime.now() 
    self.endDate = datetime.datetime.now() - datetime.timedelta(days=1000) 
    print self.stDate 
    print self.endDate 

def fetchData(self): 
    text = self.coll.aggregate([{"$match":{"ts":{"$elemMatch":{"$gte":self.stDate,"$lte":self.endDate}}}}, 
       {"$unwind":"$ts"}, 
       {"$match":{"ts":{"$gte":self.stDate,"$lte":self.endDate}}}, 
       {"$group":{"_id":"$_id","count":{"$sum":1}}}]) 
    jsondata = text["result"] 
    for each in jsondata: 
     try: 
      print each 
     except Exception, err: 
      print traceback.format_exc()   

Но это не дает никаких результатов. Может ли кто-нибудь помочь? Это из-за формата даты?

UPDATE

Я подтвердил, что тот тип, который извлекается из MongoDB является DateTime Так оно возвращается, если я запрос без каких-либо условий является

{u'_id': 111, u'ts': [datetime.datetime(2010, 8, 21, 23, 13, 35), datetime.datetime(2011, 8, 23, 9, 13, 10), datetime.datetime(2012, 8, 26, 12, 55, 51), datetime.datetime(2010, 8, 29, 3, 11, 12)]} 
+0

'{ "$ матч": { "ц": { "$ GTE": self.endDate, "$": ЛТР self.endDate}} } '- изменить на' stDate' и 'endDate'. Оба ваших матча аналогичные ошибки. – BatScream

+0

Я действительно изменил это, чтобы проверить некоторые настройки. Он не работает, даже если он является stDate и endDate в соответствующих местах. Вопрос обновлен – Neil

ответ

0

Не запускать коды. Кажется:

self.stDate = datetime.datetime.now() 
self.endDate = datetime.datetime.now() - datetime.timedelta(days=1000) 

Должно быть:

self.stDate = datetime.datetime.now() - datetime.timedelta(days=1000) 
self.endDate = datetime.datetime.now() 
+0

Ah .. Ofcourse ... Спасибо – Neil

Смежные вопросы