我有接近我需要的代码。代码以_id的单个硬编码值开头,输出显示了我所需的一切。
我的问题是我必须反复运行此脚本才能获取一系列_id的数据。我想要一个包含所有_id的脚本。可以对它们进行硬编码。
1)我需要更改此行以处理多个ID
var course_structure = db.modulestore.structures.find(
{ "_id": ObjectId("5123456ab8078204ef77ceaa") }).toArray()[0]
我认为它将看起来像这样,添加$ in并删除[0]
var course_structure = db.modulestore.structures.find({ "_id": { $in: [
ObjectId("5123456cb807821f2dac6e3a"),
ObjectId("51234561b807821f2dac6e42"),
ObjectId("5123456ab807821f2dac6e30"),
ObjectId("51234561b807821f2dac6e32")
] } }).toArray()
2)当前输出不包含_id。我目前知道_id,因为我知道脚本中的哪一个。我为一个_id运行脚本并使用输出。然后重复。如果脚本的一次运行可以处理多个_id,则需要在输出中包含_id,以便我可以判断哪些数据与_id一起使用。
我通过命令行运行此命令,输出定向到文本文件。然后,我将文本文件导入到关系数据库中。
有两部分输出。对于block_types Sequential和Vertical的部分,子数组“ children”包含在输出中。对于其他block_types,不包含子数组。这是因为子类子数组仅针对这些block_types存在。
命令: (我跳过了大部分参数)
mongo.exe MyDB C:\development\MyScript.txt > C:\development\MyOutput.json
这是我的数据结构
ROOT ARRAY
_id
edited_on
-->BLOCKS (array of type object)
block_id
block_type
definition
edit_info (object)
edited_on
fields (object)
display_name
-->CHILDREN (array of type array)
-->(array of type string)
0: string
1: string
这是我当前的代码,对于单个_id可以正常工作
var course_structure = db.modulestore.structures.find({ "_id": ObjectId("5123456ab8078204ef77ceaa") }).toArray()[0]
var course_data = {
'sequential': [],
'vertical': [],
'component': []
}
course_structure['blocks'].forEach(function(block) {
var fields = block['fields']
var block_type = block['block_type']
if(['vertical', 'sequential'].indexOf(block_type) > -1) {
var block_data = {
'definition': block['definition'],
'block_type': block['block_type'],
'block_id': block['block_id'],
'block_edited_on': block['edit_info.edited_on'],
'display_name': fields['display_name'],
'children': fields['children']
}
course_data[block_type].push(block_data)
}
else if(['html', 'done', 'problem', 'openassessment'].indexOf(block_type) > -1) {
var fields = block['fields']
var block_data = {
'definition': block['definition'],
'block_type': block['block_type'],
'block_id': block['block_id'],
'block_edited_on': block['edit_info.edited_on'],
'display_name': fields['display_name']
}
course_data['component'].push(block_data)
}
})
printjson(course_data)
经过一些操作(例如将一些方括号更改为大括号),然后将数据导入SQL Server。这将导入“顺序”块类型。
select
section ='sequential'
,[definition]
,block_type
,block_id
,block_edited_on
,display_name
,Child_Block_Type
,Child_Block_ID
into #JSON_Data1
from
openjson (@JSON,'$.sequential')
with (
--id varchar(4000) '$._id'
--,[edited_on] datetime '$.edited_on'
[definition] varchar(4000) '$.definition'
,block_type varchar(4000) '$.block_type'
,block_id varchar(4000) '$.block_id'
,block_edited_on varchar(4000) '$.block_edited_on'
,display_name varchar(4000) '$.display_name'
,children nvarchar(max) AS JSON
) as Core
cross apply
openjson(children)
with (
Child_Block_Type varchar(4000) '$.child_type'
,Child_Block_ID varchar(4000) '$.child_block_id'
) as Array
这是当前json输出中的一小部分,其中不包含_id
{
"sequential" : [
{
"definition" : ObjectId("51234561b807827583b64b3e"),
"block_type" : "sequential",
"block_id" : "3123456626004d6da21ed46cbcf22cea",
"block_edited_on" : undefined,
"display_name" : "Manually graded test",
"children" : [
[
"vertical",
"912345673ba648c2aefb7e7f4f511401"
]
]
},