有一个有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))
这两个是两个独立的调用。有什么办法让这两个调用变成一个。
当然, 投影参数 恰恰允许这样做。
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
如果你想在 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'
}
}
])