如何将我的脚本扩展为输入数组?

时间:2019-02-17 05:35:48

标签: mongodb mongodb-query

我有接近我需要的代码。代码以_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"
            ]
        ]
    },

0 个答案:

没有答案