Получить объект, содержащий только активные идентификаторы пользователей - PullRequest
0 голосов
/ 20 декабря 2018

Все еще очень плохо знакомы с Dynamo DB и эластичным поиском.

Итак, у меня есть 2 таблицы.

Таблица 1: Содержит элементы, которые я хочу отобразить Таблица 2: Содержит пользователей с активнымстолбец с логическим значением.{ active: true }

Я хочу получить все идентификаторы пользователей, которые имеют active: true, а затем извлечь объект из таблицы 1, содержащей все эти идентификаторы.

Шаг 1: Найти активных пользователей

let activeUsersResult = await es.search({
      index: userTable, //table2
      body: {
              "query": {
                "bool": {
                  "must": 
                    {
                      "match": { "active": "true" }
                    }

                }
            }
        }
    })

Этот вид работал.Моя таблица содержит 8 активных пользователей, но она получает только 7 активных пользователей.Я собирался обратиться в службу поддержки aws для этого исправления, но от SO было бы неплохо получить ответ, но не фокус здесь.

Шаг 2: Получить идентификаторы активного пользователя

let activeIds = activeUsersResult.hits.hits.map( item => item._source.userId )

Какиедает мне массив всех активных идентификаторов, который может выглядеть следующим образом:

activeIds = ['id1', 'id2', 'id3', etc....]

Шаг 3: Получить объект items, содержащий только эти активные идентификаторы из таблицы 1

Примечание. Этот es.searchтакже выполняет функцию поиска

let itemsResult = await es.search({
        index: itemTable, //table 1
        body:{
              "query": {
                "bool": {
                  "must": [
                    {
                        "query_string": {
                            "query": e.searchQuery + "*",
                            "fields": ["item_name"]
                        }
                    },
                    {
                      "match": { "sold_out": "false" },
                      "match": { "userIds" : activeIds }
                    }
                  ]
                }
            }
        }
    })

Строка соответствия, где у меня возникла проблема."match": { "userIds" : activeIds }

Мне нужен массив объектов, которые содержат только те, которые соответствуют activeIds.Я надеялся, что это даст мне идеи, но я все еще потерялся.

Спасибо!

1 Ответ

0 голосов
/ 20 декабря 2018

Я бы предложил вам использовать term и terms запрос вместо совпадения.Когда вам требуется сопоставить массив, вы должны использовать запрос terms.Таким образом, ваш запрос должен выглядеть следующим образом.

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": e.searchQuery + "*",
            "fields": [
              "item_name"
            ]
          }
        },
        {
          "term": {
            "sold_out": "false"
          }
        },
        {
          "terms": {
            "userIds": activeIds
          }
        }
      ]
    }
  }
}

Прочтите запрос term и term , чтобы понять, как они работают.

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