回答

收藏

如何从SQL转换为NoSQL / MapReduce?

技术问答 技术问答 503 人阅读 | 0 人回复 | 2023-09-14

我有使用关系数据库的背景知识,但最近开始涉足CouchDB,以及一些非关系操作(在SQL很简单)不是CouchDB一流的函数令人惊讶。! J5 a/ d( l4 i3 U4 q3 D
我希望你能花一点时间把下面的每一个都花在下面SQL句子映射到它MapReduce等效项。1 \* N. v3 r# _1 B" Q2 G4 J
SELECT COUNT(*) FROM products WHERE price 这些SELECT命令很简单。批量写入更为复杂。通常,你会使用一些视图来检索需要更改的文档,然后使用它_bulk_docsAPI一次发送所有更改。. e, m2 b6 a6 S  J8 u! Z) o. S( a
此外,请查阅相关视图文档,以获取相关查询的详细信息。这包括排序、分组等。! z3 L  z3 @: F* m
SELECT COUNT(*) FROM products WHERE price 7 _! c* K, N' |
地图function (doc) {  if (doc.price 减少_count如果您需要以任何数量工作,而不仅仅是20个,您将需要在所有情况下发布价格并使用它startkey和endkey缩小结果集的范围。
: t5 o8 \( U0 B; M$ }  f/ e4 XSELECT category,SUM(price) FROM products GROUP BY category;
5 e  A7 {4 u; v8 L, F地图function (doc) {  emit(doc.category,doc.price);}减少_sum本质上,地图函数使用类别作为键,而价格作为键/值对中值。减少功能将为每个不同的钥匙提高价格。" y' P1 c3 Z- _# ^- g. \  Z4 A/ [! ~
UPDATE products SET price = 19.99 WHERE price = 20.00;
; ?* s/ t2 l& W+ _+ Q8 W& P! P5 S2 R地图function (doc) {  if (doc.price == 20emit(doc.price);  }}一旦您的应用程序拉下视图的内容,您将在应用程序代码中执行所有操作,然后通过_bulk_docsAPI将结果发送回数据库。
; }# ]4 [5 J* I, h9 B4 |- a4 PDELETE FROM products WHERE expires_at
' h( e% X+ F8 Z. B$ N, f9 L地图function (doc) {  emit(doc.expires_at);}根据日期时间值的存储模式,您可能需要调整地图功能和查询视图。使用时间戳(JS毫秒而非秒)可能是完成此操作的最快方法。设置查询后,您将在每个文档中添加一个新字段。_deleted:true。一旦将此列表发送回数据库(再次与数据库一起)_bulk_docs),删除所有指定文件。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则