Pymongo : 有没有办法在获取数据时,在同一个调用中使用find和aggregation。

问题描述 投票:0回答:2

有一个有100万条记录的数据库,有105列的记录

对于find,我将使用这个并将其转换为df。

data=mydb.data.find({ "$and": [ {"age" : {"$gte" : "35", "$lte" : "60"}} ]
data = pd.DataFrame(list(data))

而为了只投射需要的列,我用的是这个.这两个是两个独立的调用.有没有办法把这两个调用变成一个:


data=mydb.data.aggregate([
    {
        '$project': {
            'name': '$name', 
            'age': '$age'
        }
    }
])

data = pd.DataFrame(list(data))

这两个是两个独立的调用。有什么办法让这两个调用变成一个。

python pandas mongodb aggregation-framework pymongo
2个回答
1
投票

当然, 投影参数 恰恰允许这样做。

data=mydb.data.find({ "$and": [ {"age" : {"$gte" : "35", "$lte" : "60"}} ]}, {'name': 1, 'age': 1, '_id': 0})

工作的例子。

from pymongo import MongoClient
import pandas as pd

db = MongoClient()['mydatabase']
db.mycollection.insert_one({'name': 'Foo', 'age': '40', 'address': 'bar'})

cursor = db.mycollection.find({ "$and": [ {"age" : {"$gte" : "35", "$lte" : "60"}} ]}, {'name': 1, 'age': 1, '_id': 0})
data = pd.DataFrame(list(cursor))
print(data)

给:

  name age
0  Foo  40

1
投票

如果你想在 find() 操作,您可以将投影参数作为第二个参数。

mydb.data.find({ "$and": [ {"age" : {"$gte" : "35", "$lte" : "60" } } ] }, { "name": True, "age": True })

mydb.data.find({ "$and": [ {"age" : {"$gte" : "35", "$lte" : "60" } } ] }, ["name", "age"])

你也可以在聚合管道中使用过滤器,使用的是 $match 阶段。

mydb.data.aggregate([
    {
        '$match': { '$and': [ {'age' : {'$gte' : '35', '$lte' : '60' } } ] }
    },
    {
        '$project': {
            'name': '$name', 
            'age': '$age'
        }
    }
])
© www.soinside.com 2019 - 2024. All rights reserved.