我可以 join/group 未嵌套的对象吗?
Can I join/group unnested objects?
我运行下面要从大量文档中解嵌一些数据:
select history.*
FROM checkLog c UNNEST c.history AS history
哪个returns:
[
{
"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
就好像它是主键一样。我阅读的所有文档都没有说明如何与未嵌套的对象进行连接。
感谢并为我的新鲜事道歉。
好的,这有点复杂,请耐心等待。
假设我们从 "test" 存储桶中的四个元素开始,就像您提供的数据一样。我们可以运行这个查询
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 created 子句和 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 函数和运算符的有用文档,从这里开始:
我运行下面要从大量文档中解嵌一些数据:
select history.*
FROM checkLog c UNNEST c.history AS history
哪个returns:
[
{
"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
就好像它是主键一样。我阅读的所有文档都没有说明如何与未嵌套的对象进行连接。
感谢并为我的新鲜事道歉。
好的,这有点复杂,请耐心等待。
假设我们从 "test" 存储桶中的四个元素开始,就像您提供的数据一样。我们可以运行这个查询
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 created 子句和 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 函数和运算符的有用文档,从这里开始: