Измените тип объекта со строкового на плавающий с помощью PyMongo - PullRequest
0 голосов
/ 09 июля 2020

Я подключаюсь к MongoDB, используя следующий клиент:

client = MongoClient("mongodb+srv:...")

, и я хотел бы преобразовать функцию imdbRating в float из строки во всей БД.

Как я могу этого добиться? п

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Сценарий ниже поможет вам.

client = MongoClient()

col = client['<DB-Name>']['<Coollection-Name>']

count = 0
for cursor in col.find({}, {"imdbRating": 1}):
    col.update_one({
        "_id": cursor["_id"]
    }, {
        "$set": {
            "imdbRating": float(cursor["imdbRating"])
        }
    })
    count += 1
    print("\r", count, end='')
print("\n\nDONE!!!")
0 голосов
/ 10 июля 2020

NB. В этом ответе используется оператор конвейера в update_many(), который требует MongoDB 4.2 или более поздней версии .

Во-первых, просто чтобы указать в MongoDB нет типа "float", вы можете выбрать double или decimal.

Вы можете выполнить обновление в одной строке, а в следующей строке - l oop для всех коллекций.

for col in db.list_collection_names():
    db[col].update_many({'imdbRating': {'$exists': True, '$type': 'string'}}, [{'$set': {'imdbRating': { '$toDouble': '$imdbRating'}}}])

Если вы хотите decimal вместо double, замените $toDouble на $toDecimal.

Пример с настройкой тестовых данных:

from pymongo import MongoClient
from bson.json_util import dumps

# Database connection and test data setup; 10 collections each with 10 records

db = MongoClient()['mydatabase']

for col in range(10):
    for record in range(10):
        db[f'col{col}'].insert_one({'Record': str(record), 'imdbRating': str(record)})

print('Before\n' + dumps(db.col9.find_one({}, {'_id': 0}), indent=4))

# Update all imdbRating to float from string in all collections

for col in db.list_collection_names():
    db[col].update_many({'imdbRating': {'$exists': True, '$type': 'string'}}, [{'$set': {'imdbRating': { '$toDouble': '$imdbRating'}}}])

print('After\n' + dumps(db.col9.find_one({}, {'_id': 0}), indent=4))

Дает:

Before
{
    "Record": "0",
    "imdbRating": "0"
}
After
{
    "Record": "0",
    "imdbRating": 0.0
}
...