Использовать значение поля из родительского документа в дочернем запросе - PullRequest
0 голосов
/ 24 января 2020

У меня есть отношения родитель-ребенок. В моих родительских документах есть поле с именем lastRevisionId, в котором хранится идентификатор самой последней редакции родительского документа.

Дочерние документы представляют собой неизменяемые пары ключ / значение, описывающие свойства указанной c версии parent.

Parent

{
  "_id": "parent-1",
  "lastRevisionId": "rev1"
}

Child

{
  "_id": "parent-1|rev1|name",
  "revisionId": "rev1",
  "key": "name",
  "value": "Test Server"
}

Для каждой ревизии мы будем индексировать новую дочерний документ для новой ревизии, поэтому после того, как мы обновим Parent до rev2, у нас будет это в ES:

Parent

{
  "_id": "parent-1",
  "lastRevisionId": "rev2"
}

Children

{
  "_id": "parent-1|rev1|name",
  "revisionId": "rev1",
  "key": "name",
  "value": "Test Server"
}
{
  "_id": "parent-1|rev2|name",
  "revisionId": "rev2",
  "key": "name",
  "value": "Updated Server"
}

Мне нужен запрос, который будет возвращать дочерние документы, где revisionId на дочернем документе равно lastRevisionId на родительском.

Причина этого в том, что мы хотим хранить исторические данные этих ревизий, но мы также хотим иметь возможность получать только последнюю информацию. Исторические данные действительно полезны только с точки зрения аудита, но последние могут описать большой набор полезных текущих состояний.

Мы стараемся избегать денормализации этих данных, поскольку любая отдельная редакция родителя могла бы иметь от сотен до тысяч дочерних документов, и их обновление для каждого изменения приведет к собственным проблемам масштабирования.

Если бы это было SQL, запрос выглядел бы примерно так:

SELECT c.* FROM child as c
INNER JOIN parent as p
ON p.lastRevisionId= c.revisionId

1 Ответ

0 голосов
/ 24 января 2020

вы можете использовать Nested Mapping для написания вашего запроса: elasti c .co / guide / en /asticsearch / reference / current / nested. html

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