Mój format dokumentu CouchdB jak poniżej i na podstawie zmian cenowych może być wiele dokumentów o tym samym {X0}} & AMP; store_id

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

I muszę uzyskać najnowszy document (przez time - Timestamp) dla danego {X2}} & AMP; store_id

W tym celu, z moim obecnym rozwiązaniem, muszę zrobić dwa zapytania jak poniżej;

  1. Zdobyć najnowszy znacznik czasu. Zwraca to najnowszy znacznik czasu dla danego {X0}} & AMP; 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. Na podstawie najnowszego timestamp, ponownie zapytałem, aby uzyskać dokument z trzema parametrami, które są store_id, product_id & amp; time jak poniżej,

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

Działa to idealnie dla mnie, ale mój problem polega na tym, że muszę zrobić dwa pytania DB, aby uzyskać dokument i szukał rozwiązania do pobrania dokumentu w ramach jednego zapytania DB.

W Selektor CouchdB nie ma również żadnego sposobu, aby uzyskać dokument o wartości maksymalnej.

1
mapmalith 16 styczeń 2020, 09:50

1 odpowiedź

Najlepsza odpowiedź

Dzięki CouchdB's / DB / _Find, możesz zejść {{ X0}} Wynik i limit Wynik do jednego dokumentu w następujący sposób:

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

KĘDZIOR

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

Należy pamiętać, że indeks musi być wcześniej utworzony dla pola sortowania time (patrz / DB / _index).

2
uminder 16 styczeń 2020, 10:25