如何使用python过滤mongodb游标结果?

2024-10-05 12:46:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个脚本,需要使用python从mongodb获取数据。我需要首先使用timestamp字段按降序对数据进行排序,并获取最新的100个文档,然后我需要再次使用其他字段(pinu代码和timestamp)对这100个文档进行排序。代码如下:

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

我希望第二个游标应该返回来自第一个cusor的排序数据,但它不会返回预期的结果。我知道mongodb find()sort()函数返回游标,但我可以将该游标用作其他游标的输入吗?你知道吗

PS:我正在使用Pymango模块


Tags: 数据代码文档脚本排序mongodbfindsort
2条回答

问题是不能对cursor对象复合多个排序(或限制);只有最后一个方法调用才有任何效果。我们可以用以下代码来演示这一点:

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

因此,您需要做的是使用聚合管道或类似的方法,使用单个排序/过滤器,然后对结果使用sort或sorted:

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)

find方法返回一个游标,它是对查询结果集的引用。你知道吗

你知道吗光标.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))

相关问题 更多 >

    热门问题