Как отфильтровать результат курсора Mongodb с помощью Python? - PullRequest
0 голосов
/ 03 ноября 2019

Я пишу скрипт, в котором мне нужно получить данные из mongodb, используя python. Мне нужно сначала отсортировать данные в порядке убывания, используя поле отметки времени, и взять последние 100 документов, а затем снова мне нужно отсортировать эти 100 документов на основе использования других полей (pin_code и timestamp). Вот код:

cursor = db.col.find().sort([("timestamp", pymongo.DESCENDING)]).limit(100)
cus = cursor.sort([("pin_code", pymongo.ASCENDING),("timestamp",pymongo.DESCENDING)])

Я ожидаю, что второй курсор должен вернуть отсортированные данные от первого курсора, но НЕ возвращает ожидаемый результат. Я знаю, что функции mongodb find() и sort() возвращают курсор, но могу ли я использовать этот курсор в качестве входа для другого курсора?

PS: я использую модуль pymongo

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Проблема, с которой вы столкнулись, заключается в том, что вы не можете объединить несколько видов (или, если на то пошло, лимиты) для объекта курсора;только последний вызов метода будет иметь какой-либо эффект. Мы можем продемонстрировать это с помощью следующего кода:

from pymongo import MongoClient, DESCENDING, ASCENDING
import datetime

db = MongoClient()['mydatabase']

db.testcollection.delete_many({})
for i in range (0, 1000):
    db.testcollection.insert({'timestamp': datetime.datetime.now(), 'pin_code': i})

cursor = db.testcollection.find().sort([("timestamp", DESCENDING)]).limit(50)
cursor.limit(200)
cursor.limit(100)
cursor.limit(150)
print(len(list(cursor)))

Дает:

150

Итак, вам нужно использовать конвейер агрегации или что-то в этом роде с одной сортировкой /фильтровать, а затем использовать сортировку или сортировку по результатам:

from pymongo import MongoClient, DESCENDING
import datetime

db = MongoClient()['mydatabase']

db.testcollection.delete_many({})
for i in range (0, 1000):
    db.testcollection.insert({'timestamp': datetime.datetime.now(), 'pin_code': i})

my_list = list(db.testcollection.find().sort([("timestamp", DESCENDING)]).limit(100))
my_list = sorted(my_list, key = lambda x: x['timestamp'], reverse=True)
my_list = sorted(my_list, key = lambda x: x['pin_code'])
for item in my_list:
    print (item)
0 голосов
/ 04 ноября 2019

Методы поиска возвращают курсор, который является ссылкой на набор результатов запроса.

cursor.py

#!/usr/bin/python3

from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')

with client:

    db = client.testdb

    cars = db.cars.find()

    print(cars.next())
    print(cars.next())
    print(cars.next())

    cars.rewind()

    print(cars.next())
    print(cars.next())
    print(cars.next())    

    print(list(cars))

...