BigQuery: присоединитесь к коллекции FireStore со своей коллекцией - PullRequest
0 голосов
/ 18 июня 2019

Я импортировал свои данные из пожарного магазина и у меня есть коллекция users с вложенной коллекцией profiles. Ключ пользователя можно найти в matchingUsers.__key__.name (например, «USER_KEY»), тогда как свойство __key__.path подколлекции профилей эквивалентно '"users", "USER_KEY", "profiles", "PROFILE_KEY"'.

Я пытаюсь получить всех пользователей с их профилем, поэтому я делаю соединение между двумя таблицами. Например, я заменил matchingUsers.__key__.name на userId и profiles.__key__.path на path:

WITH users AS (
  SELECT "micheleId" AS userId, "Michele" as name UNION ALL
  SELECT "matteoId", "Matteo"
),
profiles AS (
    SELECT "x" AS profileId, '"users", "micheleId", "profiles", "x"' AS path, 'player' AS type UNION ALL
  SELECT "y", '"users", "micheleId", "profiles", "y"', 'coach' UNION ALL
  SELECT "z", '"users", "matteoId", "profiles", "z"', 'team'
)
SELECT userId, profileId, type 
FROM users JOIN profiles ON users.userId IN UNNEST(SPLIT(profiles.path ));

I SPLIT путь для получения массива и последующее использование IN UNNEST для присоединения, только если в пути указан ключ пользователя.

Я получаю из этого пустой результат, хотя я ожидаю точно:

+-----------+-----------+--------+
| userId    | profileId | type   |
+-----------+-----------+--------+
| micheleId | x         | player |
| micheleId | y         | coach  |
| matteoId  | z         | team   |
+--------------------------------+

1 Ответ

1 голос
/ 19 июня 2019

Ниже приведен способ «исправить» ваш запрос (изменение только в последней строке)

#standardSQL
WITH users AS (
  SELECT "micheleId" AS userId, "Michele" AS name UNION ALL
  SELECT "matteoId", "Matteo"
),
profiles AS (
  SELECT "x" AS profileId, 'users, micheleId, profiles, x' AS path, 'player' AS type UNION ALL
  SELECT "y", 'users, micheleId, profiles, y', 'coach' UNION ALL
  SELECT "z", 'users, matteoId, profiles, z', 'team'
)
SELECT userId, profileId, type 
FROM users 
JOIN profiles 
ON users.userId IN UNNEST(SPLIT(REPLACE(profiles.path, ' ', '')))

Зависит от вашего реального варианта использования - могут быть варианты выше, как показано ниже

ON users.userId IN UNNEST(SPLIT(profiles.path, ', '))   

ИЛИ

ON users.userId IN UNNEST(SPLIT(REGEXP_REPLACE(profiles.path, r'\s', '')))   

... и т. Д.

Во всех вышеуказанных случаях - результат

Row userId      profileId   type     
1   micheleId   x           player   
2   micheleId   y           coach    
3   matteoId    z           team     

Плохо, я ошибочно добавил строку пути. Правильный формат: «пользователи», «micheleId», «профили», «x» как обновлено в вопросе

Ниже приведено "исправление" для этого

#standardSQL
WITH users AS (
  SELECT "micheleId" AS userId, "Michele" AS name UNION ALL
  SELECT "matteoId", "Matteo"
),
profiles AS (
    SELECT "x" AS profileId, '"users", "micheleId", "profiles", "x"' AS path, 'player' AS type UNION ALL
  SELECT "y", '"users", "micheleId", "profiles", "y"', 'coach' UNION ALL
  SELECT "z", '"users", "matteoId", "profiles", "z"', 'team'
)
SELECT userId, profileId, type 
FROM users JOIN profiles 
ON users.userId IN UNNEST(SPLIT(REGEXP_REPLACE(profiles.path, r'[" ]', '' )))

с, очевидно, тем же результатом

Row userId      profileId   type     
1   micheleId   x           player   
2   micheleId   y           coach    
3   matteoId    z           team    

как видите - та же идея исправления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...