Как объединить таблицы с массивом идентификаторов

Попытка использовать этот пример для объединения массива идентификаторов: https://github.com/rethinkdb/rethinkdb/issues/1533#issuecomment-26112118

Сохраняет фрагмент таблицы

{ 
  "storeID": "80362c86-94cc-4be3-b2b0-2607901804dd",
  "locations": [
    "5fa96762-f0a9-41f2-a6c1-1335185f193d",
    "80362c86-94cc-4be3-b2b0-2607901804dd"
  ]
}

Фрагмент таблицы Locations

{
  "lat": 125.231345,
  "lng": 44.23123,
  "id": "80362c86-94cc-4be3-b2b0-2607901804dd"
}

Я хочу выбрать магазины и присоединиться к их местоположениям.

Оригинальный пример от участника ReThinkDB:

r.table("blog_posts")
.concat_map(lambda x: x["comment_ids"].map(lambda y: x.merge("comment_id" : y)))
.eq_join("comment_id", r.table("comments"))

Моя попытка конвертировать в JS

r.table("stores")
 .concatMap((function(x){ 
   return x("locations").map((function(y){ 
     return x("locations").add(y);
   })) 
}))
.eqJoin("locations", r.table("locations"))

Результат

RqlRuntimeError: Expected type ARRAY but found STRING


person Dustin Brownell    schedule 03.01.2014    source источник


Ответы (1)


Вы неправильно используете concatMap, вот что вы хотите, чтобы первая часть вашего запроса была.

r.table("stores")
 .concatMap(function (x) {
   return x("locations");
 })

Попробуйте запустить это, это должно дать вам:

["5fa96762-...", "80362c86-...", ...]

Теперь нам нужно соединить это с другой таблицей. Чтобы присоединить массив идентификаторов к таблице, вы можете использовать eqjoin следующим образом:

array.eqJoin(function (row) { return row; }, table)

Здесь подробнее: rql получить несколько документов из списка ключей rethinkdb в javascript.

Собрав все вместе, мы получим:

r.table("stores")
 .concatMap(function (x) {
   return x("locations")
 })
 .eqJoin(function (i) { return i; }, r.table("locations"))

Чтобы вернуть документы из магазинов:

r.table("stores")
 .concatMap(function (x) {
   return x("locations").map(function (loc) {
      return x.merge({locations: loc});
   });
 })
 .eqJoin("locations", r.table("locations"))
person Joe Doliner    schedule 03.01.2014
comment
Феноменально, спасибо. Дополнение: если я хочу вернуть информацию о таблице моего магазина, а также связанную с ней информацию о таблице местоположений (вместо только связанной информации о местоположении), нужно ли мне выполнять отдельные запросы? - person Dustin Brownell; 03.01.2014
comment
Этот запрос не должен возвращать только информацию о местоположении. Соединения возвращают данные из обеих таблиц. - person Joe Doliner; 04.01.2014
comment
Он возвращает только массив объектов моего местоположения. Левая таблица — это только идентификатор (вместо всех полей магазина), а правая таблица — это все поля местоположения. - person Dustin Brownell; 04.01.2014