Можете ли вы выполнить соединение, используя встроенный массив в документе с помощью rethinkdb?

Скажем, у меня есть таблица пользователей со свойством, называемым FavoriteUsers, которое представляет собой встроенный массив. то есть

пользователи

{
  name:'bob'
  favoriteUsers:['jim', 'tim'] //can you have an index on an embedded array?
}

user_presence

{
   name:'jim', //index on name
   online_since:14440000
}

Могу ли я выполнить внутреннее соединение или eqJoin против, скажем, второй таблицы, используя встроенное свойство, или мне придется вытащить FavoriteUsers из таблицы пользователей в таблицу соединений, как в традиционном sql?

r.table('users')
 .getAll('bob', {index:'name'})
  // inner join  user_presence on user_presence.name in users.highlights
 .eqJoin("name", r.table('user_presence'), {index:'name'})

В конце концов, я хотел бы вызвать change() для запроса, чтобы я мог получать обновления в реальном времени об изменениях присутствия любимых пользователей пользователей.


person MonkeyBonkey    schedule 11.10.2015    source источник
comment
Можете ли вы добавить больше контекста к своему вопросу, чтобы сделать его более ясным? Какую таблицу вы хотите объединить с какой таблицей и т. д. Потому что в идеале вы можете использовать eqJoin со встроенным документом, как в примере в самом низу rethinkdb.com/api/javascript/eq_join. Вы также можете использовать getAll и concatMap и гораздо более мощную логику соединения. Это может дать тот же эффект, что и join, несмотря на то, что имя не связано с соединением.   -  person kureikain    schedule 11.10.2015
comment
Конечно, я вижу, что второй пример кода немного неясен. Я пытаюсь выполнить соединение в коде, указанном выше, обратите внимание, что в других примерах соединения соединение находится на верхнем уровне свойства документа, не связанного с коллекцией, например. user.name, а не во встроенном/вложенном свойстве документа user.favoritUsers, которое является самой коллекцией, а не свойством. Я обновлю пример кода, чтобы сделать его более понятным.   -  person MonkeyBonkey    schedule 11.10.2015


Ответы (1)


eqJoin может работать со встроенным документом, но он работает путем сравнения значения, которое мы преобразуем/выбираем из встроенного документа, чтобы пометить вторичный индекс в правой таблице.

В любом другом сложном соединении я бы предпочел использовать concatMap вместе с getAll.

Допустим, мы можем получить пользователя и user_presence из его favoriteUsers

r.table('users')
.getAll('bob', {index: 'name'})
.concatMap(function(user) {
  return r.table('user_presence').filter(function(presence) {
    return user("favoriteUsers").contains(presence("name"))
  })
)

Так что в идеале теперь вы получаете данные и сами выполняете соединение, запрашивая дополнительные данные, которые вам нужны. В моем запросе может быть некоторый синтаксис/ошибка, но я надеюсь, что это даст вам представление

person kureikain    schedule 13.10.2015