如何从SQL转换为NoSQL/MapReduce?

sfe*_*rik 13 sql database couchdb mapreduce nosql

我有一个背景与关系数据库的工作,但最近开始在CouchDB中玩水,被一些非关系型业务,这将是简单的SQL如何,没有一流的功能,在CouchDB中感到吃惊.

我很感激您花一点时间将下面的每个SQL语句映射到它的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();
Run Code Online (Sandbox Code Playgroud)

Dom*_*nes 18

这些SELECT命令非常简单.批量写入有点复杂.通常,您将使用某个视图来检索需要更改的文档,然后您将使用_bulk_docsAPI一次性发送所有更改.

另外,请参阅有关视图文档以获取有关如何发出查询的详细信息.这包括订购,分组等.


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

地图

function (doc) {
  if (doc.price < 20) {
    emit(doc.price);
  }
}
Run Code Online (Sandbox Code Playgroud)

降低

_count
Run Code Online (Sandbox Code Playgroud)

如果您需要使用任意数量而不是20,那么您需要在所有情况下都要花费价格,并使用startkeyendkey缩小结果集.


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

地图

function (doc) {
  emit(doc.category, doc.price);
}
Run Code Online (Sandbox Code Playgroud)

降低

_sum
Run Code Online (Sandbox Code Playgroud)

此映射函数主要使用类别作为键,价格作为键/值对中的值.reduce函数会将每个不同键的价格加起来.


UPDATE products SET price = 19.99 WHERE price = 20.00;

地图

function (doc) {
  if (doc.price == 20) {
    emit(doc.price);
  }
}
Run Code Online (Sandbox Code Playgroud)

一旦您的应用程序下拉了该视图的内容,您将在应用程序代码中执行所有操作,然后通过_bulk_docsAPI 将结果发送回数据库.


DELETE FROM products WHERE expires_at <= NOW();

地图

function (doc) {
  emit(doc.expires_at);
}
Run Code Online (Sandbox Code Playgroud)

根据您存储日期时间值的方式,您可能需要调整地图功能以及查看视图.使用时间戳(JS使用毫秒而不是秒)可能是实现此目的的最快方法.设置完查询后,您将为每个文档添加一个新字段._deleted: true.将此列表发送回数据库(再次发送_bulk_docs)后,将删除所有指定的文档.