如何使用python过滤mongodb游标结果?
我正在编写一个脚本,需要使用python从mongodb获取数据。我首先需要使用timestamp字段按降序对数据进行排序,并获取最新的100个文档,然后再次需要使用其他字段(pin_代码和timestamp)对这100个文档进行排序。代码如下:如何使用python过滤mongodb游标结果?,python,mongodb,pymongo,Python,Mongodb,Pymongo,我正在编写一个脚本,需要使用python从mongodb获取数据。我首先需要使用timestamp字段按降序对数据进行排序,并获取最新的100个文档,然后再次需要使用其他字段(pin_代码和timestamp)对这100个文档进行排序。代码如下: cursor = db.col.find().sort([("timestamp", pymongo.DESCENDING)]).limit(100) cus = cursor.sort([("pin_code", pymongo.ASCENDING)
cursor = db.col.find().sort([("timestamp", pymongo.DESCENDING)]).limit(100)
cus = cursor.sort([("pin_code", pymongo.ASCENDING),("timestamp",pymongo.DESCENDING)])
我希望第二个游标应该返回来自第一个cusor的排序数据,但它不会返回预期的结果。我知道mongodbfind()
和sort()
函数返回游标,但我可以使用该游标作为其他游标的输入吗
PS:我正在使用pymongo模块,find方法返回一个游标,它是对查询结果集的引用 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))
问题是不能在游标对象上复合多个排序(或限制);只有最后一个方法调用才会有任何效果。我们可以用以下代码演示这一点:
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)
你能解释一下你所期望的是什么,以及这与你所看到的有什么不同。另外,请发布示例文档和你迄今为止所做的尝试。