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
}