Couchbase 我可以加入/分组未列出的对象吗?

Couchbase 我可以加入/分组未列出的对象吗?,couchbase,n1ql,Couchbase,N1ql,我正在运行以下命令,以便从大量文档中卸载一些数据: 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"

我正在运行以下命令,以便从大量文档中卸载一些数据:

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
但是,在这种情况下,唯一已知的键值对是
创建的日期
,其他列是暂时的。因为这个,我有点迷路了。我无法使用
select*
groupby
进行分组,并且我在
创建的
上未成功加入,就好像它是主键一样。我读过的所有文档都没有显示如何与未列出的对象进行连接


感谢并为我的新身份道歉。

好的,这有点复杂,请耐心听我说

假设我们从“test”bucket中的四个元素开始,就像您提供的数据一样。我们可以运行这个查询

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
    }
  }
]
[
  {
    "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
      }
    ]
  }
]
然后我们需要做很多事情。首先,我们需要将具有相同日期的元素分组。我们可以使用GROUPBY created子句和array_agg()聚合函数来实现这一点,该函数将所有聚合对象放入一个数组中。这让我们得到了这个查询:

select array_agg(test) as elements from test group by created
这就产生了这个结果

[
  {
    "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
    }
  }
]
[
  {
    "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_flatte()),并将这些对重新分组为对象(使用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函数和运算符的有用文档:


非常感谢-显然我还有很多东西要学。我将把它拆开并使用它。:)