N1QL-запрос для присоединения к документу с последним дочерним элементом (на основе creationDateTime) в couchbase - PullRequest
0 голосов
/ 28 мая 2019

N1QL-запрос, чтобы получить последний документ с таким же другим свойством в результате объединения двух разных документов в couchbase

У меня есть корзина под названием "цены" с двумя различными типами документов "намерение" и "запрос"

  "intent"  (id = "intent1")
  {
  "locationDSL": "some_location"
  "product": "some_product1"
  }
  "intent"  (id = "intent2")
  {
  "locationDSL": "some_location2"
  "product": "some_product2"
  }
  "request"  (id = "request1")
  {
  "intentId": "intent1",
  "createdDateTime": "2019-04-01",
  "status" : "success"
  }
  "request"  (id = "request2")
  {
  "intentId": "intent1",
  "createdDateTime": "2019-05-01"
   "status" : "failed"
  }
  "request"  (id = "request3")
  {
  "intentId": "intent2",
  "createdDateTime": "2019-06-01",
 "status" : "failed"
  }
  "request"  (id = "request4")
  {
  "intentId": "intent2",
  "createdDateTime": "2019-07-01",
  "status" : "success"
  }

поэтому у меня есть 2 запроса ("request1" и "request2") для "intent1" и 2 запроса ("request3" и "request4") для intent2,

Мне нужно объединить " intent1 " и " intent2 " с последними запросами (запрос с последним createDateTime), т. Е. " request2 " и " request4"соответственно, а также может фильтровать по некоторым полям последнего дочернего документа, соответствующего" intentId ", поэтому если запрос для" status "=" success ", то он должен только возвращать (intentId2, request4), а не (intent1) , request1), поскольку в последнем дочернем элементе «request2» не соответствует условию

Я могу присоединиться к документам, но это соединение не с последними запросами, но все запросы соответствуют intent.id .

Этот вопрос похож на [ Фильтрация документов с использованием n1ql , но мне нужно объединение всех полей в двух документах, а не в одном поле или атрибутах

1 Ответ

3 голосов
/ 28 мая 2019

На основании вашего запроса попробуйте следующее. Подзапрос использует индекс покрытия и извлекает только последний документ в родительском запросе

CREATE INDEX ix1 ON pricescmd(intentId, status, createdDateTime DESC);
SELECT intents, request
FROM (SELECT mx.*
      FROM pricescmd
      WHERE intentId IS NOT NULL 
      GROUP BY intentId, status
      mx = MAX([createdDateTime, {META().id, intentId, status} ])[1] )  AS d
LET request = (SELECT RAW request FROM pricescmd AS request USE KEYS d.id)[0],
    intents = (SELECT RAW intent FROM pricescmd AS intent USE KEYS d.intentId)[0];
...