我正在运行以下命令以取消大量文档中的某些数据:
select history.*
FROM checkLog c UNNEST c.history AS history
哪个返回:
[
{
"x": "OK",
"created": "2018-06-19"
},
{
"x": "OK",
"created": "2018-06-20"
},
{
"y": "ISSUES",
"created": "2018-06-19"
},
{
"y": "ISSUES",
"created": "2018-06-20"
}
]
这接近我要寻找的。我想在每个唯一的日期加入所有这些对象。这将是一个示例:
[
{
"y": "ISSUES",
"x": "OK",
"created": "2018-06-19"
},
{
"y": "ISSUES",
"x": "OK",
"created": "2018-06-20"
}
]
我已经获得了这些结果
select history.created, max(x) as x, max(y) as y
FROM checkLog c UNNEST c.history AS history
GROUP BY history.created
但是,在这种情况下,唯一的已知键值对是created:date
,其他列是瞬态的。因此,我有点迷路。我不能group by
和select *
一起使用,并且我未能成功加入created
,就好像它是主键一样。我阅读的所有文档都没有显示如何对未嵌套的对象进行联接。
感谢和歉意。
答案 0 :(得分:2)
好的,这有点复杂,请耐心等待。
让我们假设我们从“测试”存储桶中的四个元素开始,就像您提供的数据一样。我们可以运行此查询
select * from test
并获得此结果
[
{
"test": {
"created": "2018-01-01",
"x": 1
}
},
{
"test": {
"created": "2018-01-01",
"y": 1
}
},
{
"test": {
"created": "2018-02-02",
"x": 2
}
},
{
"test": {
"created": "2018-02-02",
"y": 2
}
}
]
然后我们需要做很多事情。首先,我们需要将具有相同日期的元素分组。我们可以使用GROUP BY创建的子句和array_agg()聚合函数来完成此操作,该函数将所有聚合的对象放入数组中。这使我们得到以下查询:
select array_agg(test) as elements from test group by created
产生此结果
[
{
"elements": [
{
"created": "2018-01-01",
"x": 1
},
{
"created": "2018-01-01",
"y": 1
}
]
},
{
"elements": [
{
"created": "2018-02-02",
"x": 2
},
{
"created": "2018-02-02",
"y": 2
}
]
}
]
然后,使用每个组的元素,我们需要将每个元素分成名称-值对(使用object_pairs()),将对象数组的阵列展平为仅对象的阵列(使用array_flatten()),然后将对重新组合为对象(使用OBJECT运算符)。
我们可以相应地使用此查询
select OBJECT vv.name:vv.val FOR vv in ARRAY_FLATTEN(ARRAY object_pairs(v) FOR v IN i.elements END, 1) END as unified
FROM (select array_agg(test) as elements from test group by created) i
获得此输出,这就是您想要的
[
{
"unified": {
"created": "2018-02-02",
"x": 2,
"y": 2
}
},
{
"unified": {
"created": "2018-01-01",
"x": 1,
"y": 1
}
}
]
所有这些实际上都非常复杂,我鼓励您逐级剥离该查询,直到您理解为止。您可以从此处开始找到有关N1QL函数和运算符的有用文档: