问题描述
我正在使用MarkLogic10。我有一个装有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中可用的功能可以执行以下映射:
- 使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split 将text属性的值拆分为换行符上的字符串数组
- 使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce 减少数组
reduceer的种子值可能是一个JavaScript对象,其中包含状态(树中前一个节点的深度)和当前输出对象(已适当初始化)。
reducer函数可以执行以下操作:
- 用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的客户端语言完成映射。
希望有帮助,