У меня есть код, который близок к тому, что мне нужно.Коды начинаются с одного жестко закодированного значения _id, а вывод дает мне все, что мне нужно.
Моя проблема в том, что мне приходится многократно запускать этот скрипт, чтобы получить данные для серии _id.Я хочу иметь один скрипт, который включает в себя все _id.Хорошо, что они жестко запрограммированы.
1) Мне нужно изменить эту строку для обработки нескольких идентификаторов
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_ty нет подмассива.Это потому, что дочерний подмассив присутствует только для этих 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"
]
]
},