Запрос CouchDB для получения do c с отметкой времени MAX - PullRequest
1 голос
/ 16 января 2020

Мой формат документа CouchDB, как показано ниже, и в зависимости от изменения цены может быть несколько документов с одинаковым product_id & store_id

{ "_id": "6b645d3b173b4776db38eb9fe6014a4c", "_rev": "1-86a1d9f0af09beaa38b6fbc3095f06a8", "product_id": "6b645d3b173b4776db38eb9fe60148ab", "store_id": "0364e82c13b66325ee86f99f53049d39", "price": "12000", "currency": "AUD_$", "time": 1579000390326 }

, и мне нужно получить последний document (по time - метка времени) для заданного product_id & store_id

Для этого, с моим текущим решением, я должен выполнить два запроса, как показано ниже;

  1. Для получения последней отметки времени. Это возвращает самую последнюю временную метку для заданного product_id & store_id

    "max_time_by_product_store_id": { "reduce": "function(keys, values) {var ids = [] values.forEach(function(time) { if (!isNaN(time)){ ids.push(time); } }); return Math.max.apply(Math, ids) }", "map": "function (doc) {emit([doc.store_id, doc.product_id], doc.time);}" }

  2. На основе последнего timestamp, снова я запрашиваю, чтобы получить документ с тремя параметрами, которые store_id, product_id & time, как показано ниже,

    "store_product_time": { "map": "function (doc) { emit([doc.store_id, doc.product_id, doc.time]); }" }

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

В селекторе CouchDB также нет способа получить документ по значению MAX.

1 Ответ

2 голосов
/ 16 января 2020

С / db / _find в CouchDB вы можете убрать sort результат и limit результат в один документ следующим образом:

{
   "selector": {
      "_id": {
         "$gt": null
      }
   },
   "sort": [
      {
         "time": "desc"
      }
   ],
   "limit": 1
}

CURL

curl -H 'Content-Type: application/json' -X POST http://localhost:5984/<db>/_find -d '{"selector":{"_id":{"$gt":null}},"sort":[{"time": "desc"}],"limit": 1}'

Обратите внимание, что предварительно необходимо создать индекс для поля сортировки time (см. / db / _index ).

...