如何使用 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 时,整数类型被转换为字符串(参见fgafgm),日期列也被转换为字符串。此图显示了 BigQuery 的原始架构。

我们正在尝试使用python mongodb 客户端库pymongofgafgm 转换为整数类型。大概(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'

这些错误对我们来说都是完全有意义的,但我们仍然不确定如何将本例中的 fgafgm 更新为 int。另外,是否有特定于 mongo 的 datetimestamp 类型可以用于 [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 使用pymongo操作mongodb库

python标准库Beautiful Soup与MongoDb爬喜马拉雅电台的总结

。Net Core中用于MongoDB的JSON:API库

如何使用 MongoDB 和 Spring 的存储库更新列表?

python操作mongodb

在 Meteor 运行时,如何从另一个客户端访问 Meteor 的 MongoDB?