如何使用 python mongodb 客户端库(pymongo)更新 mongodb 集合中所有文档的字段“类型”
Posted
技术标签:
【中文标题】如何使用 python mongodb 客户端库(pymongo)更新 mongodb 集合中所有文档的字段“类型”【英文标题】:How to update field "type" for all documents in mongodb collection using python mongodb client library (pymongo) 【发布时间】:2021-07-21 20:28:36 【问题描述】:这是完成重要数据管道的最后一个链接。我们有以下换行符分隔的 JSON,我们已将其从 BigQuery 导出到 GCS,然后在本地下载:
"name":"Terripins","fga":"42","fgm":"28","fgPct":0.67
"gameTime":"2019-01-12 12:00:00 UTC","gameDate":"2019-01-12","updated":"2019-01-12 20:25:03 UTC","isHome":true,"name":"","fga":"0","fgm":"0"
"gameTime":"2019-01-12 12:00:00 UTC","gameDate":"2019-01-12","updated":"2019-01-12 20:25:03 UTC","isHome":true,"name":"Crusaders","fga":"54","fgm":"33","fgPct":0.61
"gameTime":"2019-01-12 12:00:00 UTC","gameDate":"2019-01-12","updated":"2019-01-12 20:25:03 UTC","isHome":false,"name":"Greyhounds","fga":"54","fgm":"33","fgPct":0.61
"gameTime":"2019-01-12 12:00:00 UTC","gameDate":"2019-01-12","updated":"2019-01-12 20:25:03 UTC","isHome":false,"name":"Greyhounds","fga":"68","fgm":"20","fgPct":0.29
"gameTime":"2019-01-12 12:00:00 UTC","gameDate":"2019-01-12","updated":"2019-01-12 20:25:03 UTC","isHome":true,"name":"Crusaders","fga":"68","fgm":"20","fgPct":0.29
我们mongoimport
这个进入我们的mongodb集群,集合创建成功:
不幸的是,当我们从 BigQuery 导出 JSON 时,整数类型被转换为字符串(参见fga
、fgm
),日期列也被转换为字符串。此图显示了 BigQuery 的原始架构。
我们正在尝试使用python mongodb 客户端库pymongo 将fga
和fgm
转换为整数类型。大概(a)将“字符串化”的json文件加载到mongodb中,然后使用pymongo更新类型更容易,而不是(b)直接在JSON文件中更新或修复类型before @ 987654331@ing 进入 mongo。所以我们正在尝试(a)。
import(pymongo)
... connect to db and set "db"
our_collection = db["our_coll_name"]
# query and set for "update"
myquery = # for whole table
newvalues = "$set": "fga": int(fga) # change to int
# and update
new_output = our_collection.update_many(myquery, newvalues)
print(new_output.modified_count, "documents updated."
这不起作用,因为int(fga)
返回错误name 'fga' is not defined
,如果我们改为运行int("fga")
,则会收到错误ValueError: invalid literal for int() with base 10: 'fga'
。
这些错误对我们来说都是完全有意义的,但我们仍然不确定如何将本例中的 fga
和 fgm
更新为 int
。另外,是否有特定于 mongo 的 date
和 timestamp
类型可以用于 [gameTime, gameDate, updated]
3 个字段,我们如何使用 pymongo 进行这些转换?
【问题讨论】:
【参考方案1】:假设 MongoDB 4.2 或更高版本。
使用 MongoDB 的 toInt()
和 toDate()
函数。
为了清楚起见,我将它们分成单独的命令,但如果您愿意,可以在一个 update_many() 中运行它。
our_collection.update_many(, ['$set': 'fga': '$toInt': '$fga'])
our_collection.update_many(, ['$set': 'fgm': '$toInt': '$fgm'])
our_collection.update_many(, ['$set': 'gameTime': '$toDate': '$gameTime'])
our_collection.update_many(, ['$set': 'gameDate': '$toDate': '$gameDate'])
our_collection.update_many(, ['$set': 'updated': '$toDate': '$updated'])
文档:
https://docs.mongodb.com/manual/reference/operator/aggregation/toInt/ https://docs.mongodb.com/manual/reference/operator/aggregation/toDate/
【讨论】:
我认为我们有 4.0,尽管根据文档,这些似乎也适用于 4.0 版 - 很快就会尝试一下以上是关于如何使用 python mongodb 客户端库(pymongo)更新 mongodb 集合中所有文档的字段“类型”的主要内容,如果未能解决你的问题,请参考以下文章
python标准库Beautiful Soup与MongoDb爬喜马拉雅电台的总结