Jak przetłumaczyć z SQL na NoSQL / MapReduce?

Mam doświadczenie w pracy z relacyjnymi bazami danych, ale ostatnio zacząłem interesować się CouchDB i byłem zaskoczony tym, że niektóre nie relacyjne operacje, które byłyby proste w SQL, nie były pierwszorzędnymi funkcjami w CouchDB.

Byłbym wdzięczny za poświęcenie chwili, aby odwzorować każde polecenie SQL poniżej do jego odpowiednika MapReduce.

SELECT COUNT(*) FROM products WHERE price < 20.00;
SELECT category, SUM(price) FROM products GROUP BY category;
UPDATE products SET price = 19.99 WHERE price = 20.00;
DELETE FROM products WHERE expires_at <= NOW();
Author: sferik, 2011-06-25

1 answers

Polecenia SELECT są dość proste. Pisanie zbiorcze jest nieco bardziej skomplikowane. Ogólnie rzecz biorąc, będziesz używać niektórych widoku, aby odzyskać dokumenty, które wymagają zmiany, a następnie użyjesz _bulk_docs API, aby wysłać wszystkie zmiany na raz.

Zapoznaj się również z dokumentacją dotyczącą widoków, aby uzyskać szczegółowe informacje dotyczące wysyłania zapytań. Obejmuje to zamawianie, grupowanie itp.


SELECT COUNT(*) FROM products WHERE price < 20.00;

Mapa

function (doc) {
  if (doc.price < 20) {
    emit(doc.price);
  }
}

Reduce

_count

Jeśli potrzebujesz tego aby pracować z dowolną kwotą, a nie tylko 20, musisz we wszystkich przypadkach podać cenę i użyć startkey i endkey, aby zawęzić zestaw wyników.


SELECT category, SUM(price) FROM products GROUP BY category;

Mapa

function (doc) {
  emit(doc.category, doc.price);
}

Reduce

_sum

Ta funkcja mapy zasadniczo używa kategorii jako klucza, a cena jako wartości w parze klucz / wartość. Funkcja redukcji sumuje ceny dla każdego innego klucza.


UPDATE products SET price = 19.99 WHERE price = 20.00;

Mapa

function (doc) {
  if (doc.price == 20) {
    emit(doc.price);
  }
}

Once your aplikacja pobiera zawartość tego widoku, wykonasz wszystkie manipulacje w kodzie aplikacji, a następnie wyślesz wyniki do bazy danych za pośrednictwem API {[7] }.


DELETE FROM products WHERE expires_at <= NOW();

Mapa

function (doc) {
  emit(doc.expires_at);
}

W zależności od sposobu przechowywania wartości daty i czasu, może być konieczne dostosowanie funkcji mapy, a także zapytania do widoku. Używanie znacznika czasu (JS używa milisekund zamiast sekund) jest prawdopodobnie najszybszym sposobem, aby to osiągnąć. Po skonfigurowaniu swojego zapytanie, dodasz nowe pole do każdego z tych dokumentów. _deleted: true. Po wysłaniu tej listy z powrotem do bazy danych (ponownie z _bulk_docs) wszystkie określone dokumenty zostaną usunięte.

 17
Author: Dominic Barnes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-25 19:42:11