我是MongoDB和JSON格式的新手。我在MongoDB集合中具有以下JSON格式。我想从每个内部对象中获取value2,value 4和value时间,并将其导出到CSV。同样,每个文档的内部对象数可以从1到4个对象变化。我该如何在python中做到这一点?
[{"object":[
{"value1":number,
"value2"":number,
"value3"":number,
"value4"":"code",
"value5"":number,
"value6"":"name"}
,
{"value1":number,
"value2":number,
"value3":number,
"value4":"code",
"value5":number,
"value6":"name"}]
,
"time":1550666169274}]"""
答案 0 :(得分:0)
欢迎堆栈溢出!
您的格式在语法上不正确。您还应该(根据规则)提供到目前为止您尝试过的示例。您是新手,因此您会获得通行证,但请记住以备将来=)
不清楚您要问什么。似乎有两个问题-1.如何访问和捕获数据结构中的数据,2.如何将捕获的数据写入csv。
要回答第一部分(访问和捕获数据): 您有列表和字典。要访问列表中的值,请使用后面的值的索引号(第一个索引号以0开头)。
例如如果我有列表l = ['zero', 'one', 'two']
,则可以通过执行l[1]
来访问字符串'one',其中1是列表l
中索引'one'的编号。
要访问词典中的某些内容,可以使用其键。
例如。 d = {'key': 'value'}
使用d['key']
来获取对应的值-'value'
因此,假设您的数据实际上是这样的:
my_json = [
{
"object":[
{
"value1":1,
"value2":1,
"value3":1,
"value4":"code",
"value5":1,
"value6":"name"
},
{
"value1":1,
"value2":1,
"value3":1,
"value4":"code",
"value5":1,
"value6":"name"
}
],
"time":1550666169274
}
]
您拥有的是一个包含字典的列表; “对象”键的值是包含字典的列表,“时间”键的值是字符串。
因此您可以像这样访问数据:
my_json[0]
>>> {'object': [{'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}, {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}], 'time': 1550666169274}
或者,如果列表中有多个对象,则可以遍历这样有用的对象列表):
for i in range(len(my_json)):
my_json[i]
>>> {'object': [{'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}, {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}], 'time': 1550666169274}
my_json[0]
是字典-这样您就可以访问它的值(字典列表):
my_json[0]['object']
>>> [{'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}, {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}]
my_json[0]['time']
>>> 1550666169274
这是一个列表,因此再次使用索引:
my_json[0]['object'][0] # or iterate through the list of objects as above
>>> {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}
为您提供字典,因此请使用它的密钥:
my_json[0]['object'][0]['value2']
>>> 1
依此类推...
由于“每个文档的内部对象的数量可以从1到4个对象变化”,因此您真的想遍历“对象”所包含的词典列表。您可以这样做:
all_docs = [] # create an empty list to hold further captured data
for obj in range(len(my_json)): # for each 'thing' in this list
obj_time = my_json[obj]['time'] # grab the time
values_sought = [] # create an empty list to hold further captured data
for dictionary in my_json[obj]['object']: # for each 'thing' in the 'object''s list
val_2 = dictionary['value2'] # grab the necessary values
val_4 = dictionary['value4']
values_sought.append((val_2, val_4)) # append them to the empty list above
print(obj_time, values_sought)
>>> 1550666169274 [(1, 'code'), (1, 'code')]
all_docs.append((obj_time, values_sought)) # append each document's data to the all_docs list
print(all_docs)
>>> [(1550666169274, [(1, 'code'), (1, 'code')])]
假设您有两个文档(在顶层),all_docs看起来像这样:
[(1550666169274, [(1, 'code'), (1, 'code')])
(1550666169275, [(1, 'code'), (1, 'code')]),]
现在您可以遍历此列表和类似这样的元组:
document_1 = all_docs[0]
document_1_data_all = all_docs[1]
document_1_data_1 = all_docs[1][0] # (or iterate)
document_2 = all_docs[1]
...等
第二部分,写入csv,取决于您希望格式化的方式。我建议您看看python内置的csv module。
希望有帮助