如何用PyMongo插入含ISODate格式的JSON数据至MongoDB?
解决PyMongo导入含$date的JSON时无法识别为ISODate的问题
问题根源
mongoimport工具会自动识别MongoDB的扩展JSON格式,把$date标记的内容转成ISODate对象;但用Python标准库的json.load解析时,只会把{ "$date": "..." }当成普通字典,PyMongo插入时自然不会处理成日期类型,导致没法用$gt、$lt做范围查询。
最简单的解决方案:用bson.json_util解析JSON
PyMongo自带了bson.json_util模块,专门用来处理MongoDB的扩展JSON,能直接把$date转成Python的datetime对象,插入时自动对应MongoDB的ISODate。
修改后的代码
from pymongo.mongo_client import MongoClient from bson.json_util import loads # 替换标准的json.load if __name__ == '__main__': with MongoClient() as mongo: db = mongo.get_database("mydb") with open("data.json", "r") as data_file: # 先读取文件内容,再用bson的loads解析 data_content = data_file.read() docs = loads(data_content) db["mycollectionII"].insert_many(docs, ordered=False)
验证结果
插入后查询,born字段会显示为ISODate('2018-11-10T22:26:12.111Z'),完全支持日期范围查询。
备选方案:直接调用mongoimport命令
如果数据量特别大,或者不想改解析逻辑,也可以在Python里直接调用mongoimport命令,复用它的解析能力:
import subprocess # 执行mongoimport导入数据 subprocess.run([ "mongoimport", "-d", "mydb", "-c", "mycollectionII", "--jsonArray", "--type", "json", "data.json" ], check=True)
内容的提问来源于stack exchange,提问作者Nelly Barret
相关产品推荐
相关产品推荐

