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"
]
}
我有一个名为 '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"
]
}