所以我目前正在学习MongoDB,而且我使用的是PyMongo而不是MongoDB shell。
当我开始尝试基本的CRUD操作时,我发现很难使用PyMongo加载bios
数据,因为website上发布的原始数据有一个奇怪的ISODATA
time
。
原来的python JSON
库似乎不支持这个,mongoimport
似乎也不支持这个(不确定)。但我发现this,在修改为{$date:"2017-04-01T05:00:00Z"}
之后,mongoimport
正在运作。
现在我使用subprocess
调用外部命令来导入数据。所以我的问题是,如何使用python正确读取JSON数据并使用PyMongo插入数据。
mongodb文档中的bios
数据如下所示
{
"_id" : 1,
"name" : {
"first" : "John",
"last" : "Backus"
},
"birth" : ISODate("1924-12-03T05:00:00Z"),
"death" : ISODate("2007-03-17T04:00:00Z"),
"contribs" : [
"Fortran",
"ALGOL",
"Backus-Naur Form",
"FP"
],
"awards" : [
{
"award" : "W.W. McDowell Award",
"year" : 1967,
"by" : "IEEE Computer Society"
},
{
"award" : "National Medal of Science",
"year" : 1975,
"by" : "National Science Foundation"
},
{
"award" : "Turing Award",
"year" : 1977,
"by" : "ACM"
},
{
"award" : "Draper Prize",
"year" : 1993,
"by" : "National Academy of Engineering"
}
]
}
当我尝试使用Python的JSON库解析它时,由于json.decoder.JSONDecodeError
,我收到错误消息"birth" : ISODate("1924-12-03T05:00:00Z"),
。由于同样的原因,mongoimport
无法解析此问题。
当我修改时,
"birth" : ISODate("1924-12-03T05:00:00Z"),
进入
"birth" : $date:"2017-04-01T05:00:00Z"
mongoimport
正在运行,但python仍然无法解析它。
我在这里问的是一种在Python和PyMongo中处理这个问题的方法,而不是调用外部命令。
答案 0 :(得分:1)
您正在查看的示例可能是在mongo shell中使用,其中可以如图所示解析ISODate bson类型的使用。
除此之外,我们面临的挑战是JSON没有date数据类型,也没有标准的日期表示方式。为了应对这一挑战,MongoDB创建了一个名为Extended JSON的东西,它可以用JSON编码日期,类似于你用$date
显示的日期。
为了在Python / PyMongo中使用扩展JSON,您可以使用json_util。
这是一个简短的例子:
from bson.json_util import loads
from pymongo import MongoClient
json = '''
{
"_id" : 1,
"name" : {
"first" : "John",
"last" : "Backus"
},
"birth" : {"$date":"2017-04-01T05:00:00.000Z"},
"death" : {"$date":"2017-04-01T05:00:00.000Z"}
}
'''
bson = loads(json)
print(str(bson))
db = MongoClient().test
collection = db.bios
collection.insert(bson)