我正在使用MarkLogic 10。我有一个加载了JSON数据的数据库。我有一个字段没有被解析。我想做的是:样本数据:
{"books": {"Harry Potter": {"text": "There are several harry potter books:/n-Chamber of Secrets/n--chess/n--dog/n-Goblet of Fire/n--dragon/n--broomstick "}
所需的输出类似于:
{"books": {"Harry Potter": {"subject": "There are several harry potter books:",
"book 1" : {
"title": "-Chamber of Secrets",
"Contents 1" : "--chess",
"Contents 2" : "--dog"},
"book 2" : {
"title":"-Goblet of Fire",
"Contents 1" : "--dragon",
"Contents 2" : "--broomstick"}}}}
MarkLogic有一个可以轻松做到这一点的函数吗?
将文本字符串中的行映射到输出对象的属性将需要脚本。
服务器端JavaScript中可用的函数可以进行映射:
- 将text属性的值拆分为换行符上的字符串数组https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split
- 使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
reducer的种子值可能是一个JavaScript对象,它包含状态(树中前一个节点的深度(和当前输出对象(根据需要初始化(。
减速器功能可能会执行以下操作:
- 将当前字符串的前导连字符与https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
- 获取前导连字符字符串的长度以确定当前深度https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length
- 根据深度更新状态和输出对象:
- 如果当前深度大于先前深度,则打开一个新对象
- 如果当前深度小于先前深度,则关闭先前对象
- 如果先前的深度相同,则在相同深度处添加特性
在加载之前,还可以用支持JSON的客户端语言进行映射。
希望有帮助,