couchbase n1ql простое внутреннее соединение с использованием неключевых элементов
У меня есть ведро на диване под названием "тест", в котором есть 2 документа. Ключ к этим документам - хэш-значение времени их создания.
Док 1:
Ключ - 3ddd743fd229063273fc1db076e0c81e7b5077909abcba51088febf119c3233c
значение -
{
"empId": 1,
"e_name": "abc",
"type": "m",
"managerId": null
}
Документ 2:
ключ - 33d57d98b68a270ac972b1f392d21d435bbdb1f5cf5a7bbabb1bfacb1215eaac
значение -
{
"empId": 2,
"e_name": "def",
"type": "r",
"managerId": 1
}
Я пытаюсь выполнить внутреннее соединение, чтобы после объединения запрос возвращал что-то вроде
{
"empName": "def",
"managerName": "abc"
}
В этом случае я не могу выполнить внутреннее соединение, потому что соединение не на ключе. У меня вопрос, как мне этого добиться.
1 ответ
До Couchbase Server 5.5 единственное объединение, которое вы можете сделать в N1QL, должно иметь ключ документа на одной стороне объединения.
С Couchbase Server 5.5 (в настоящее время находится в бета-версии) вы можете использовать "соединение ANSI", чтобы присоединиться к любому полю в документе (дополнительная информация в этом сообщении в блоге: Новые функции запросов в Couchbase Server 5.5), но, по сути, вы можете написать объединение так же, как вы делаете в реляционных базах данных. Мне не ясно в вашем примере, к каким полям вы действительно хотите присоединиться (managerId, я думаю?), Но синтаксис будет выглядеть так:
SELECT emp.*, man.*
FROM test emp
INNER JOIN test man ON emp.managerId = man.managerId
Если вы еще не готовы использовать 5.5, то может существовать альтернативный способ структурирования ваших данных для такого рода объединения или, возможно, подумать об альтернативном подходе (то, что вы делаете здесь, кажется очень реляционным, когда это может не надо быть).
Поскольку похоже, что "менеджер" является типом "сотрудника", то, возможно, документ менеджера может содержать массив идентификаторов документов для сотрудников, которыми управляет менеджер. Затем вы можете присоединить этот массив к ключам документов сотрудника. Например:
{
"empId": 1,
"e_name": "abc",
"type": "m",
"managerId": null,
"employeesOfThisManager" : [
"33d57d98b68a270ac972b1f392d21d435bbdb1f5cf5a7bbabb1bfacb1215eaac",
"33d57d98b68a270ac972b1f392d21d435bbdb1f5cf5a7bbabb1foobarbaz1234"
]
}