Возвращение результата поиска в монго в функции python - PullRequest
0 голосов
/ 25 ноября 2018

Я написал следующую функцию, чтобы взять период времени и вернуть результаты в основную программу после выполнения поиска в монго с помощью пакета pymongo:

def searchMsgByDate (mycol,option):
    dt = date.today()
    if option == "today":
        start = datetime.combine(dt, datetime.min.time())
         end = datetime.combine(dt, datetime.max.time())
    elif option == "yesterday":
        start = datetime.combine(dt, datetime.min.time()) - timedelta(days=1)
        end = datetime.combine(dt, datetime.max.time()) - timedelta(days=1)
    elif option == "week":
        start = datetime.combine( dt - timedelta(days=dt.weekday()), datetime.min.time())
        end = datetime.combine(dt, datetime.max.time())
    elif option == "month":
        start = datetime.combine( dt - relativedelta(day=1) , datetime.min.time())
        end = datetime.combine(dt, datetime.max.time())
    elif option == "year":
        start = datetime.combine( dt - relativedelta(month=1,day=1) , datetime.min.time())
        end = datetime.combine(dt, datetime.max.time())
    elif option == "forever":
        start = datetime.combine( date(1970, 1, 1) , datetime.min.time())
        end = datetime.combine(dt, datetime.max.time())
    else:
        print("Invalid option for searchMsgMain; exiting")

    result = mycol.find({"msg_date": { "$gte": start, "$lt": end}});
    record_count = 0
    for entry in result:
        record_count = record_count + 1
    if record_count > 0:
        print ("Records found =", record_count)
    else:
        print ("No records found")
    return result

Вот основная программа, которая вызываетфункция:

out = searchMsgByDate(mycol)
for entry in out:
   ....
   ....

Когда я это делаю, в основной программе ничего не происходит.Я могу подтвердить, что результат поиска в функции дает более 90 записей

Я думаю, что я делаю что-то не так с возвратом объекта такого типа, или это невозможно.Я могу успешно возвращать простые значения.

Любые мысли приветствуются.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

1) Вы не должны выполнять подсчет самостоятельно, просматривая элементы курсора.Вместо этого вы можете вызвать метод db.collection.find ({}). Count ().Документацию можно найти здесь

2) Я не уверен, что такое myCol, но это должен быть объект MongoClient.database_name.Например, рассмотрим следующий фрагмент кода:

from pymongo import MongoClient

class Events:
    def __init__(self):
        self.client = MongoClient('localhost', 27017)
        self.database = self.client.KKNY

    def retrieveEvents(self):
        event_names = self.database['event_names']
        return event_names.find({})

Как видите, я инициализирую MongoClient, имя базы данных в этом случае - KKNY.С этого момента я могу получить доступ к коллекции в этой базе данных, запустив self.database['event_names'].

3) Также, пожалуйста, укажите версию, которую вы используете для pymongo, теперь она облегчит нашу жизнь

0 голосов
/ 26 ноября 2018

Я записал результаты в массив и отправил их обратно как функцию return.Работал отлично.

mongo_query = mycol.find({"msg_date": { "$gte": start, "$lt": end}});
record_count = 0
result = []
for entry in mongo_query:
    result.append(entry)
    record_count = record_count + 1
if record_count == 0:
    print ("No records found")
return result
...