Как мне расширить мой скрипт для массива входных данных? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть код, который близок к тому, что мне нужно.Коды начинаются с одного жестко закодированного значения _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"
            ]
        ]
    },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...