Pymon go: есть ли способ использовать поиск и агрегирование в одном вызове при извлечении данных - PullRequest
0 голосов
/ 26 мая 2020

У вас есть база данных с 1 миллионом записей со 105 столбцами

для поиска, я использую это и конвертирую в 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))

это два отдельных вызова. есть ли способ объединить эти два вызова в один.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Конечно, параметр проекции позволяет именно это.

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 голос
/ 26 мая 2020

Если вы хотите проецировать на операцию 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'
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...