使用 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 中的多个联接 的相关文章

  • MS Access 不支持连接表达式吗?

    谁能向我解释我的查询有什么问题吗 SELECT T2 TIPOPRODUTO T2 PRODUTO T1 ESPESSURA AS LARGURA AS COMPRIMENTO AS ACABAM REVEST AS ESPECIF QUA
  • 字符集和排序规则到底是什么意思?

    我可以阅读MySQL文档而且非常清楚 但是 如何决定使用哪种字符集呢 校对对什么数据有影响 我要求解释这两者以及如何选择它们 来自 MySQLdocs http dev mysql com doc refman 5 0 en charset
  • 数据库、表和列命名约定? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每当我设计数据库时 我总是想知道是否有命名数据库中项目的最佳方法 我经常问自己以下问题 表名应该是复数吗 列名应该是单数吗 我应该为表或列添加前
  • PostgreSQL 中的 LATERAL JOIN 和子查询有什么区别?

    自从 PostgreSQL 推出以来 它具备了以下功能 LATERAL连接 我一直在阅读它 因为我目前为我的团队进行复杂的数据转储 其中有许多低效的子查询 使整个查询需要四分钟或更长时间 我明白那个LATERALjoins 可能可以帮助我
  • 在 django 中创建“历史”类型模型的最佳方法是什么?

    我想为我的 Django 应用程序创建一个类似于 Django 管理员的 最近操作 的功能 以便存储其他模型的历史信息 例如 假设我有两个模型 分别称为 Book 和 Author 我想要第三个模型来存储信息 例如由谁以及何时对模型中的给定
  • 无法找到与 from-view-id '/pages/index.xhtml' 匹配的导航案例

    我在 JSF 页面之间导航时遇到问题 我的大部分导航都是在您单击命令按钮时发生的 命令按钮的操作返回一个字符串 我的登录页面是我的欢迎页面 它位于我的 web xml 中
  • Rails:从视图内渲染视图(不是部分视图)

    我有一个对两者都有响应的控制器html and js The htmlview 渲染整个页面 包括页眉和页脚 而js仅替换 main 除了页眉和页脚之外 两种格式呈现相同的内容 我可以用三个文件获得这种效果 show html erb di
  • hadoop中reducer的数量

    我正在学习hadoop 我发现减速器的数量非常令人困惑 1 reducer的数量与partition的数量相同 2 reducer 的数量是 0 95 或 1 75 乘以 节点数 每个节点的最大容器数 3 减速机数量设定为mapred re
  • mongodb - 检索数组子集

    看似简单的任务对我来说是一个挑战 我有以下 mongodb 结构 services TCP80 data status 1 delay 3 87 ts 1308056460 status 1 delay 2 83 ts 1308058080
  • ember js 子视图和 didinsertelement 事件

    我正在写一个Ember View 它将树结构变成菜单 我需要递归 所以我在视图模板中使用的是 view helper 它递归地调用自身来构建嵌套 ul li 结构 我需要的是一个钩子来调用一些 jQuery 插件来将此结构转换为菜单 当我从
  • 多个数据库连接

    我有三张桌子 categories content info and content The categories表包含类别的id及其 IDparent类别 The content info包含两列 entry id帖子的 ID 和cat
  • boost::algorithm::join 的一个很好的例子

    我最近想用提升 算法 加入 http www boost org doc libs 1 41 0 doc html string algo reference html header boost algorithm string join
  • 设计 Cassandra 数据模型的最佳实践是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 以及需要避免哪些陷阱 您有任何交易中断吗 例如 我听说导出 导入 Cassandra 数据非常困难 这让我想知道这是否会妨碍将生产数据
  • JSON 值的模式匹配

    运行 Postgres 12 5 的本地 docker 实例 4MBwork mem 我正在实施这个图案 https dba stackexchange com q 108447 3684搜索 json 中的任意字段 目标是搜索并返回 JS
  • RavenDB:为什么我会在此多重映射/归约索引中获得字段空值?

    受到 Ayende 文章的启发https ayende com blog 89089 ravendb multi maps reduce indexes https ayende com blog 89089 ravendb multi m
  • 在数据库中建模抽象基类和子类

    我有4个子类 Video Image Note and Form 每一项都包含不同类型的数据 例如 Image类包含磁盘上图像文件的路径和图像属性 以及Form类包含表单字段值 然而 每个项目之间的共同元素是 GPS 坐标和航向 因此我有以
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • 如何根据条件删除结果以计算平均值

    我有下面的架构 对其的快速解释是 鲍勃评分为 5 5 詹姆斯评分 1 5 梅西百货评分高达 5 5 逻辑 如果我是 A 请查找我屏蔽的所有人 查阅所有电影评论 任何留下电影评论且 personA 已屏蔽的人 请将其从计算中删除 计算电影的平
  • 如何将变量传递给 django 中的所有模板? [复制]

    这个问题在这里已经有答案了 我正在尝试将变量 浏览器变量 传递给我的应用程序中的所有模板 关于如何让它发挥作用有什么建议吗 View def browser request primary cat list Categories objec
  • Riak 在 MapReduce 查询中失败。使用哪种配置?

    我正在与 riak riak js 结合开发一个 nodejs 应用程序 并遇到以下问题 运行此请求 db mapreduce add logs run 正确返回存储在存储桶日志中的所有 155 000 个项目及其 ID logs 1GXt

随机推荐

  • 防止@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