couchbase n1ql 使用非键元素的简单内部连接

couchbase n1ql simple inner join using non-key elements

我有一个名为 'test' 的 couchbase 存储桶,其中包含 2 个文档。这些文档的关键是它们各自创建纪元时间的哈希值。

文档 1:

密钥 - 3ddd743fd229063273fc1db076e0c81e7b5077909abcba51088febf119c3233c

值 -

{
  "empId": 1,
  "e_name": "abc",
  "type": "m",
  "managerId": null
}

文档 2:

键 - 33d57d98b68a270ac972b1f392d21d435bbdb1f5cf5a7bbabb1bfacb1215eaac

值 -

{
  "empId": 2,
  "e_name": "def",
  "type": "r",
  "managerId": 1
}

我正在尝试执行内部联接,以便在联接后查询会 return 类似于

{
    "empName": "def",
    "managerName": "abc"
}

在这种情况下,我无法在此处执行内部联接,因为联接不在键上。我的问题是如何实现这一目标。

在 Couchbase Server 5.5 之前,您可以在 N1QL 中进行的唯一联接必须在联接的一侧具有文档键。

借助 Couchbase Server 5.5(目前处于测试阶段),您可以使用 "ANSI join" 加入文档中的任何字段(更多信息请参见此博客 post:New Querying Features in Couchbase Server 5.5)但本质上,您可以像在关系数据库中一样编写连接。我不清楚您的示例中您实际想要加入哪些字段(我猜是 managerId?),但语法如下所示:

SELECT emp.*, man.*
FROM test emp
INNER JOIN test man ON emp.managerId = man.managerId

如果您还没有准备好使用 5.5,那么可能有另一种方法来构造您的数据以进行这种连接,或者考虑另一种方法(您在这里所做的似乎很关系,当它可能不需要时)。

既然看起来 'manager' 是 'employee' 的一种类型,那么经理文档可能包含经理正在管理的员工的文档 ID 数组。然后您可以将该数组连接到员工文档键。例如:

{
  "empId": 1,
  "e_name": "abc",
  "type": "m",
  "managerId": null,
  "employeesOfThisManager" : [
     "33d57d98b68a270ac972b1f392d21d435bbdb1f5cf5a7bbabb1bfacb1215eaac",
     "33d57d98b68a270ac972b1f392d21d435bbdb1f5cf5a7bbabb1foobarbaz1234"
  ]
}