使用 CouchDB 视图替换 SQL 中的多个联接

2024-04-07

我正在为我的应用程序实现过滤功能,但在 CouchDB 上编写视图时遇到问题。在 SQL 中,这将是一个具有多个连接的语句。如何替换 CouchDB 中的多重连接。本文涵盖单连接:http://www.cmlenz.net/archives/2007/10/couchdb-joins http://www.cmlenz.net/archives/2007/10/couchdb-joins。但是,对于我来说,如何将这种方法扩展到多重连接并不明显。

想象我的对象有十几个属性,每个属性都可以有其单独的过滤器。为了简单起见,我们假设它只有两个属性。如果我们能解决这个问题,我们就可以将其扩展到任意数量的属性。

我的应用程序需要支持一堆 AND 过滤器。例如。查找位置位于(“西雅图”,“纽约”)且起始纪元 >= 1336608413 的所有会话。而且我还需要保留过滤器设置。

在 SQL 中,我有两个表:Session 和 Filter。然后,我在会话和过滤器表之间为每个过滤条件建立一个连接,以获取所有过滤的会话。

Session Table
location    start-epoch    
Seattle     1336608413     

Filter Table
Name        Value
location    Seattle
location    New York
start-epoch 1336608413     


Query:
select * 
from Session s 
where exists (select 1 from Filter f where f.name = 'location' and f.value = s.location)
     and exists (select 1 from Filter f on f.name = 'start-epoch' and s.start-epoch >= f2.value)

在 CouchDB 中:

{"type":"session", "location":"Seattle", "start-epoch":1336608413}

那么如何建模filter和编写view呢?

过滤器可能是这样的:

{"type":"filter", "location":["Seattle", "New York"], "start-epoch":1336608413}

那么视图怎么写呢?

我想在 CouchDB 中实现这一点。我希望创建一个名为 FilteredSessions 的视图,并在对 Couch 的一次 http 调用中检索过滤后的会话。原因是因为我有 5 个不同的客户端(iOS、Android、Silverlight、Ruby on Rails 和 Windows 8),并且我不想重写逻辑 5 次。如果我使用 sqlite,我可以创建一个名为“FilteredView”的视图来实现这一点。我希望在mapreduce中写出等价的东西。


嗯......我不确定你到底需要什么,但这就是我的理解。您有一个称为会话的数据集合,然后还有另一个称为过滤器的数据集合。然后,您想要从会话中组装另一个数据集合,但使用过滤器数据从会话中选择特定数据。如果这是正确的,有几种方法可以做到这一点,这是其中之一:

假设您有 30 个左右的会话文档。它们各有两个属性:位置和起始纪元。例如:

{
 "_id"         : "f80hqwfe8nfaodnia9dgs8n9",
 "location"    : "Seattle",
 "start-epoch" : "1336608413",
 "type"        : "session"
}

Or...

{
 "_id"         : "f8fsdnio345235aodnia9dgs8n9",
 "location"    : "New York",
 "start-epoch" : "1236630174",
 "type"        : "session"
}

然后你有一些过滤器,例如:

{
 "_id"         : "f80hqwfe8nfaodnia9dgs8n9",
 "location"    : "New York",
 "type"        : "filter"
}

Or...

{
 "_id"         : "f80hqwfe8nfaodnia9dgs8n9",
 "start-epoch" : "1336608413",
 "type"        : "filter"
}

您可以将所有会话拉到一个视图中:

"sesssions": {
  "map": "function (doc) {
    if (doc.type === "session") {
      emit(doc.start-epoch, doc);
    }
}"

然后,将所有过滤器拉到一个视图中(您可以即时更新):

"filters": {
  "map": "function (doc) {
    if (doc.type === "filter") {
      emit(doc.type, doc);
    }
}"

然后我会在 Nodejs 中组装我的最终“视图”。我会对数据库的过滤器视图发出请求,或者根据需要创建一个新的过滤器,并将其存储在变量中,例如过滤器或过滤器。然后我会再次调用数据库的会话视图,并将该数据提取到变量中,例如会话。

这里有一点补充说明。您需要调用视图(假设您存储了 couch 返回到 var 视图中的 json 对象),然后将 view.rows 存储到会话变量中,这将为您提供一个会话数组,如下所示:

[
 {
  "_id"         : "f80hqwfe8nfaodnia9dgs8n9",
  "location"    : "Seattle",
  "start-epoch" : "1336608413",
  "type"        : "session"
 },
 {
  "_id"         : "f8fsdnio345235aodnia9dgs8n9",
  "location"    : "New York",
  "start-epoch" : "1236630174",
  "type"        : "session"
 }
]

然后就做

var myFinalView = sessions.forEach(function (session) {
  if (filter.location !== session.location) {
    // session.splice or delete session
  }
  return;
})

然后 myFinalView 将是您需要的 JSON 对象。我希望这是有道理的。如果需要的话请让我详细说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CouchDB 视图替换 SQL 中的多个联接 的相关文章

  • 动态表单字段验证的数据库设计

    在我的应用程序中 我允许用户创建一个包含他们想要的任何 HTML 表单字段 例如文本输入 文本区域 选择等 的表单 我想让用户能够为每个字段定义 0 个或多个累积验证规则 最多可能有 25 个不同的验证规则 我应该如何建模 这是一个潜在的解
  • SQL Server 2012 中带有“AND”运算符的“LIKE”子句

    我的要求与该线程完全相同 如何在 SQL Server 中使用 JOIN LIKE 和 AND 运算符 https stackoverflow com questions 39745766 how to use join like with
  • 对如何在 Android 上使用 CouchDB 感到困惑

    我想让 CouchDB 作为我的移动应用程序的后端运行 取代 SQlite 作为这项技术的新手 我一直感到非常困惑 因为除了去年 Couchbase 发布的所有听起来类似的产品 Couchbase Couchbase Single Serv
  • android 选项卡小部件内列表视图中的滑动事件

    我创建了一个显示列表视图的活动 并且在滑动操作时使用 ViewFlipper 显示另一个列表 代码附在下面 import android app Activity import android os Bundle import androi
  • 具有自定义标题颜色和图像的 UITabBarItem

    我正在尝试在 xcode ios 中自定义我的 TabBar 但是我刚刚发现 ppl 说这是不可自定义的 另外 我确实找到了某种解决方案 但它们都不适合我 我几乎想更改 UITabBarItem 标题 文本 颜色 并更改其中的 2 张图像
  • CMD 或 Powershell 命令组合(合并)两个文件中的相应行[重复]

    这个问题在这里已经有答案了 是否可以使用 CMD 和 Powershell 将 2 个文件合并为 1 个文件 如下所示 file1 line1 tab file2 line1 file1 line2 tab file2 line2 file
  • Android 滚动视图未填充父视图

    我有以下包含滚动视图的布局 屏幕尺寸大于 4 8 英寸左右后 视图底部会出现白色区域 当我将滚动视图指定为 fill parent 时 为什么会出现这种情况 提前致谢 请注意 在下面的屏幕截图中 您看不到菜单下方的空白区域 因为它是白色的
  • 如何找到 Oracle 视图的基础列和表名称?

    这听起来应该很简单 但事实并非如此 我找不到任何 Oracle 元数据 视图可以提供 Oracle 视图列的基础列和表名称 我发现这样做的唯一方法是解析视图源 SQL 这与精确的科学相去甚远 为了解释我想要什么 请考虑我在 SCOTT 模式
  • 数据库设计 - 何时拆分表?

    有时创建一个单独的表会产生更多工作 我是否应该将其拆分 例如 在我的项目中 我有一张客户表 每个客户对每种产品都有自己的特殊价格 只有5种产品 未来不会计划更多产品 每个客户也有一周中公司向他交付产品的独特日子 当日期和产品价格是客户表中的
  • 联合超过 2 个 pandas 数据框

    我正在尝试将 sql 查询转换为 python sql语句如下 select from table 1 union select from table 2 union select from table 3 union select fro
  • MySQL:“SELECT 将检查超过 MAX_JOIN_SIZE 行”

    我正在使用 PHP 和 MySQL 在我的程序中 有一个涉及连接的选择查询 当我在本地主机上运行它时 它工作正常 但是当我将它上传到我的服务器上并尝试执行它时 它会生成以下错误 The SELECT would examine more t
  • Rails 5:迭代的数据库设计

    我目前有一个包含用户 餐食和订单表的网站 Users表保存用户信息 餐食表包含餐食名称 描述 img url 我目前正在使用迭代来显示餐食 span class mealname span p p p p div class qty INP
  • Sparklyr - 在 Apache Spark Join 中包含空值

    问题在 Apache Spark Join 中包含空值 https stackoverflow com questions 41728762 including null values in an apache spark join有 Sc
  • MapReduce 中的分区到底是如何工作的?

    我认为我总体上对 MapReduce 编程模型有一定的了解 但即使在阅读了原始论文和其他一些来源之后 我仍然不清楚许多细节 特别是关于中间结果的分区 我将快速总结到目前为止我对 MapReduce 的理解 我们有一个可能非常大的输入数据集
  • Id 或 [TableName]Id 作为主键/实体标识符

    是否首选使用 Id 作为主键的列名或 TableName Id 作为命名约定 表 账户主键 ID 相对 表 账户主键 AccountId 在我见过的实现中 它似乎分为 50 50 左右 每种方法的优点和缺点是什么 跟进 在我的数据库中使用一
  • 为什么 CouchDB 使用仅追加 B+ 树而不是 HAMT

    我正在阅读数据结构 尤其是不可变的数据结构 例如仅追加 B 树 http guide couchdb org draft btree html用于 CouchDB 和哈希数组映射 trie http en wikipedia org wik
  • Mongodb 聚合数组中的子文档

    我正在使用 mongodb 作为后端实现一个小型应用程序 在此应用程序中 我有一个数据结构 其中文档将包含一个包含子文档数组的字段 我使用以下用例作为基础 http docs mongodb org manual use cases inv
  • 为什么 Spark 比 Hadoop MapReduce 更快

    有人可以使用字数统计示例解释一下为什么 Spark 比 MapReduce 更快吗 bafna的答案提供了故事的记忆方面 但我想补充另外两个重要事实 DAG和生态系统 Spark 使用 惰性求值 来形成连续计算阶段的有向无环图 DAG 通过
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • 一列作为主键或两个外键作为主键

    我有以下数据库设计 An E Report有一个QAP其中有一些Requirements A QAP和它的Requirements 可以用于多个E Report Every Requirement每份电子报告中都会有 是 否 确认 我已经添

随机推荐

  • 防止@EnableWebMvc注释的类被@ComponentScan拾取

    我有以下测试类 ActiveProfiles DataTC test RunWith SpringJUnit4ClassRunner class ContextConfiguration classes BaseTestConfigurat
  • MyBatis:使用动态查询比较字符串值

    我正在使用 MyBatis 来映射一些需要比较的查询String争论 myString 我的地图绘制者界面 is public Map
  • NHibernate二级缓存性能问题

    我正在使用 NHibernate 使用每个请求会话模式开发一个 MVC 应用程序 大多数时候用户只是读取数据 因此我尝试通过以下方式使用 NHibernate 的二级缓存 我设置了 SysCache 并使所有持久实体可缓存 缓存使用 non
  • 普通数组也是动态的吗? [复制]

    这个问题在这里已经有答案了 以下是我的C代码 main int a 1 a 0 10 a 1 12 printf d n a 1 copy arr a printf d a 1 以下是输出 12 12 它不应该给出数组越界或类似的东西吗 或
  • 使用 setText 方法时 JLabel 不更新

    在我目前正在进行的项目中 我希望通过 Jlabel 显示几条信息 GUI 中的其他位置有一些按钮和文本字段 允许更改所述信息 我想更新 JLabel 但文本永远不会更改 或在启动时更新 我尝试使用并发来更新标签 正如本网站上其他问题中所建议
  • Expression.Lambda() 的参数问题

    更新 这确实有效 我很愚蠢 我有以下扩展方法 public static string ExtMethod this object self object myparameter 在运行时 可以通过多种方式调用它 我认为这些都是可能的 Ex
  • 按 dplyr 中 mutate_at 中的名称排除列

    我正在尝试做一些非常简单的事情 但无法找出正确的指定方法 我只是想从中排除一些命名列mutate at 如果我指定位置 它就可以正常工作 但我不想对位置进行硬编码 例如 我想要与此相同的输出 mtcars gt mutate at c 1
  • 如何将textmate文件资源管理器移到右侧?

    如何将textmate文件资源管理器移到右侧 Update 对于更高版本的 textmate 请参阅这个答案 https stackoverflow com a 53817213 908886 对于 Textmate 2 在回答此问题后很久
  • 为什么我们不在 http 上发送二进制而不是文本?

    看起来二进制会更紧凑并且可以以标准方式反序列化 为什么使用文本代替 这似乎效率低下 Web 框架被迫只做与字符串相关的事情 为什么没有二进制标准 网络将变得更快 浏览器将能够非常快速地加载二进制页面 如果我要启动一个二进制协议 HBP 超二
  • 如何在iOS中创建非圆角UIProgressView

    我将 UIProgressView 子类化为 import UIKit class MyProgressView UIProgressView override func sizeThatFits size CGSize gt CGSize
  • 与证书颁发机构签署证书请求

    我想使用 TLS 相互身份验证来对 go 中制作的 API 上的客户端进行身份验证 我已经创建了一个证书颁发机构 假设鲍勃有一个他想要与客户端一起使用的密钥对 Bob 创建了一个证书请求并希望我验证他的证书以获得授权并 在 API 上进行身
  • 导航控制器的后退按钮问题 (iPhone)

    所以这是我正在寻找的功能 1 主菜单没有导航栏2 主菜单中的所有其他屏幕都是如此 3 它应该正确地设置动画 我部分地让它工作 只是不是后退按钮部分 在主菜单 viewDidLoad 中 我只需执行以下操作 self navigationCo
  • 如何在 O(1) 时间内将数组归零?

    有没有一种方法可以将数组归零 时间复杂度为 O 1 很明显 这可以通过for loop memset来完成 但它们的时间复杂度不是O 1 Yes 但不是任何数组 它需要一个专门为此工作而设计的数组 template
  • Control.Applicative 中“pure”函数的命名[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为什么将值提升为函子的函数命名为pure在控制 应用 考虑到pure作为形容词 foo lt gt pure 4 foo应用于pure v
  • 这些 g++“多重定义”错误是怎么回事?

    我正处于一个项目的早期阶段 请阅读 昨天刚刚开始 我正在设置我的初始 makefile 这非常简单 以下是该文件的完整内容 all main o resource o g o output exe main o resource o mai
  • RISC-V 调用约定的 ABI 寄存器名称

    我对 RISC V ABI 寄存器名称感到困惑 例如 第 85 页的 RISC V 指令集手册 第一卷 用户级 ISA 版本 2 0 中的表 18 2 指定堆栈指针sp正在注册x14 然而 指令 addi sp zero 0 由 riscv
  • 未捕获错误:没有为密码定义索引(Firebase 错误)

    我对 firebase 很陌生 我正在尝试检索特定数据 并收到此错误 请在这件事上给予我帮助 我的代码看起来像这样 var t1 this password value var user id this state comments 2 f
  • SML 中的柯里化匿名函数

    我有下面的功能并且它有效 fn x gt x 2 2 但这不起作用 fn x y gt x y 2 3 谁能告诉我为什么 或者给我一些提示让它发挥作用 fn x gt fn y gt x y 2 3 works fn只是没有相同的语法糖来定
  • 如何使用python将F2键发送到远程主机

    I have to send F2 key to telnet host How do I send it using python using getch I found that the character lt used for th
  • 使用 CouchDB 视图替换 SQL 中的多个联接

    我正在为我的应用程序实现过滤功能 但在 CouchDB 上编写视图时遇到问题 在 SQL 中 这将是一个具有多个连接的语句 如何替换 CouchDB 中的多重连接 本文涵盖单连接 http www cmlenz net archives 2