2017-09-19 63 views
2

我有属于同一集合一些JSON文件(阿尔法):如何仅将JSON文档分组为不同的值?

Aplha_a.json 

{ 
    "date": "24-july-2017", 
    "ID": "001", 
    "data": "a", 
    "reg_date": "24-july-2017" 
} 

Aplha_b.json 

{ 
    "date": "24-july-2017", 
    "ID": "001", 
    "data": "b", 
    "reg_date": "24-july-2017" 
} 

Aplha_c.json 

{ 
    "date": "24-july-2017", 
    "ID": "001", 
    "data": "c", 
    "reg_date": "24-july-2017" 
} 

以上的JSON文件是从集合“阿尔法”获取使用的ID是由下面提到的查询做:

cts:search(collection("alpha"), 
      cts:and-query((
          cts:json-property-range-query("ID", "=", "001"), 
          cts:json-property-value-query("reg_date", "24-july-2017") 
      )) 
) 

现在,这些不同的json文件需要分组为一个alpha_family文档,只返回不同的节点。输出应该如下:

{Alpha_family: { 
    "date": "24-july-2017" 
    "ID": "001" 
    "data": "a" 
    "data": "b" 
    "data": "c" 
    "reg_date": "24-july-2017" 
} 

任何人都可以帮助实现这一目标吗?

在此先感谢。

回答

2

如何迭代文档,并在旅途中汇总json对象中的不同值。例如:

xdmp:document-insert("/Aplha_a.json", xdmp:unquote(' 
    { 
    "date": "24-july-2017", 
    "ID": "001", 
    "data": "a", 
    "reg_date": "24-july-2017" 
    } 
'), xdmp:default-permissions(), "alpha"), 

xdmp:document-insert("/Aplha_b.json", xdmp:unquote(' 
    { 
    "date": "24-july-2017", 
    "ID": "001", 
    "data": "b", 
    "reg_date": "24-july-2017" 
    } 
'), xdmp:default-permissions(), "alpha"), 

xdmp:document-insert("/Aplha_c.json", xdmp:unquote(' 
    { 
    "date": "24-july-2017", 
    "ID": "001", 
    "data": "c", 
    "reg_date": "24-july-2017" 
    } 
'), xdmp:default-permissions(), "alpha") 

; 

let $json := json:object() 
let $_ := 

    for $doc in cts:search(collection("alpha"), 
    cts:and-query((
     cts:json-property-value-query("ID", "001"), 
     cts:json-property-value-query("reg_date", "24-july-2017") 
    )) 
) 
    for $prop in $doc//text() 
    let $exists := map:get($json, name($prop)) 
    return 
    map:put($json, name($prop), distinct-values(($exists, $prop))) 

return $json 

我对用例不太确定,而且这种方法在较大的数据集上会严重缩放。但是,如果搜索总是只返回一些文件,它可能会足够你的..

HTH!

+0

不能使用distinct-values,因为我将使用对较大数据集的查询。有没有其他的选择? – LSB

+0

那么,你可以使用cts:values,但是这需要知道所有的属性,并且对它们都有范围索引。 – grtjn

+0

我可以使用functx:distinct-deep?这个功能也会打到性能推荐请。 – LSB

相关问题