理解 jq JOIN()

2023-11-24

我试图理解JOIN()内置于jq.

来自 jq 手册(https://stedolan.github.io/jq/manual):

JOIN($idx; stream; idx_expr; join_expr):

This builtin joins the values from the given stream to the given index. 
The index's keys are computed by applying the given index expression to each value from the given stream. 
An array of the value in the stream and the corresponding value from the index is fed to the given join expression to produce each result.

我发现如果没有例子这很难理解。

您能否举一些其用法示例来展示其工作原理?


这个函数应该类似于JOIN中的条款SQL。它用于组合来自两个(或多个)的行SQL) 表,基于它们之间的相关列。

让我们构建一些“表”。

第一个应该是带有 ID 的订单列表,ID 引用订购的客户和订购的产品:

[
  {
    "OrderID": "10",
    "CustomerIDRef": "2",
    "ProductIDRef": "7"
  },
  {
    "OrderID": "11",
    "CustomerIDRef": "1",
    "ProductIDRef": "7"
  },
  {
    "OrderID": "12",
    "CustomerIDRef": "2",
    "ProductIDRef": "14"
  },
  {
    "OrderID": "13",
    "CustomerIDRef": "2",
    "ProductIDRef": "7"
  }
]
as $orders

让第二个是映射到其姓名的客户列表:

[
  {
    "CustomerID": "1",
    "CustomerName": "Alfred"
  },
  {
    "CustomerID": "2",
    "CustomerName": "Bill"
  },
  {
    "CustomerID": "3",
    "CustomerName": "Caroline"
  }
]
as $customers

As jq's JOIN一次只能处理两个表(如果要处理更多,则需要级联),让我们忽略缺少的 Products 表。

在我们到达之前JOIN我们需要看看INDEX首先,它将像上面的表一样的数组转换为一个对象,其中表的“主键”作为字段名称。这是合理的,因为字段名称是唯一的,使得查找始终返回不超过一条记录。

INDEX($customers[]; .CustomerID)
{
  "1": {
    "CustomerID": "1",
    "CustomerName": "Alfred"
  },
  "2": {
    "CustomerID": "2",
    "CustomerName": "Bill"
  },
  "3": {
    "CustomerID": "3",
    "CustomerName": "Caroline"
  }
}

Demo

现在,我们可以轻松地执行JOIN订单(如“左表”)与其客户(如“右表”)之间的操作。提供“右表”作为INDEXed 对象,“左表”作为流.[],以及左表对象中的“相关列”作为与右表主键(查找对象中的字段名称)匹配的字段,我们得到:(令最后一个参数为.目前)

JOIN(INDEX($customers[]; .CustomerID); $orders[]; .CustomerIDRef; .)
[
  {
    "OrderID": "10",
    "CustomerIDRef": "2",
    "ProductIDRef": "7"
  },
  {
    "CustomerID": "2",
    "CustomerName": "Bill"
  }
]
[
  {
    "OrderID": "11",
    "CustomerIDRef": "1",
    "ProductIDRef": "7"
  },
  {
    "CustomerID": "1",
    "CustomerName": "Alfred"
  }
]
[
  {
    "OrderID": "12",
    "CustomerIDRef": "2",
    "ProductIDRef": "14"
  },
  {
    "CustomerID": "2",
    "CustomerName": "Bill"
  }
]
[
  {
    "OrderID": "13",
    "CustomerIDRef": "2",
    "ProductIDRef": "7"
  },
  {
    "CustomerID": "2",
    "CustomerName": "Bill"
  }
]

Demo

正如您所看到的,我们得到一个数组流,每个订单一个。每个数组都有两个元素:左表中的记录和右表中的记录。不成功的查找会产生null在右侧。

最后,第四个参数是“连接表达式”,描述了如何连接两个匹配的记录,它本质上充当了一个map.

JOIN(INDEX($customers[]; .CustomerID); $orders[]; .CustomerIDRef;
  "\(.[0].OrderID): \(.[1].CustomerName) ordered Product #\(.[0].ProductIDRef)."
)
10: Bill ordered Product #7.
11: Alfred ordered Product #7.
12: Bill ordered Product #14.
13: Bill ordered Product #7.

Demo

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

理解 jq JOIN() 的相关文章

随机推荐

  • IIS Express 为每个请求加载和卸载模块

    我们有一个 ASP NET 项目在调试时使用 IIS Express 启动VS2013 然后加载解决方案 构建解决方案并在调试模式下启动Web应用程序后 输出窗口列出了一堆已加载和卸载的DLL 经过一番搜索后 我发现 IIS Express
  • Redis 是单线程的。那我为什么要用生菜呢?

    Redis 4 0之后 Redis可以多线程执行一些功能 1 删除后台对象等 但Redis通常仍然使用单线程 常见问题解答 Redis 所以我觉得生菜没什么用 Lettuce 是 Redis 客户端 可以在 1 个连接中使用多个线程 但 R
  • 如何确保提交到 ThreadPoolExecutor 然后取消的 FutureTask 的垃圾回收?

    我正在提交Callable对象到ThreadPoolExecutor他们似乎一直留在记忆中 使用 Eclipse 的 MAT 工具查看堆转储 可以看到Callable对象正在被引用FutureTask Sync s callable多变的
  • eclipse中“JUnit插件测试”和“JUnit测试”之间的区别

    在eclipse运行命令中 有两种选择 JUnit Plug in Test and JUnit Test 之前 我尝试启动 eclipse 插件测试 org eclipse jdt ui tests refactoring 我遇到了一些问
  • 如何使用 C++ 在 Windows 中复制和粘贴文件?

    我已经用谷歌搜索过这个 但我仍然对如何使用它感到困惑 我正在制作一个文件管理器 我希望能够将文件复制并粘贴到新目录中 我知道要复制我需要使用file copy 但我不确定如何将其实现到我的代码中 我想使用 fstream 来做到这一点 如果
  • 缓存生成器

    最近的一个类似问题 isinstance foo types GeneratorType 还是inspect isgenerator foo 让我好奇如何一般地实现这一点 实际上 拥有一个生成器类型的对象似乎是一个普遍有用的东西 它将在第一
  • D3树:用线代替对角线投影

    我正在使用 d3 js 创建一棵树这个例子 这可以完美地处理我拥有的数据并产生期望的结果 除了一个细节 我不想要那些wiggly节点之间的连接线 我想要一条干净简单的线 谁能告诉我如何制作它 我一直在查看 d3 js 的 API 文档 但没
  • WPF WebBrowser 浏览器版本

    WPF WebBrowser 控件是否取决于用户计算机上安装的 IE 版本 或者它是否使用跨计算机一致的单独库 我读到它只能在 IE7 模式下呈现 但我想确保没有安装 IE 或由于某种原因仍在 IE6 上的用户不会出现任何问题 The MS
  • 点击 MKAnnotation 来“选择”它真的很慢

    在点击 MKMapView 上的注释和显示标注之间有近 0 5 秒的延迟 有谁知道为什么会出现这种情况 以及当用户点击地图时如何使其立即响应 即使用户位置注释在点击时在标注中显示 当前位置 也会发生这种情况 我希望它在点击时立即显示 没有奇
  • 找到重叠的圆圈

    我有一个矩形区域 其中有半径相等的圆 我想找到哪些圆与其他圆重叠 输出是重叠圆的 2 元素集的列表 我知道如何检查两个圆是否重叠 它们的中心之间的距离小于直径 我可以对每对圆圈执行此检查 但我想知道是否有更好的算法 比O n 2 EDIT
  • 用于 iOS 开发的 Objective-C++

    是否可以使用 Objective C 进行 iOS 应用程序 iPhone iPad iPod touch 开发 网上有例子和源代码吗 使用 ObjC 非常简单 您必须声明扩展名为 mm 的源文件 它将使编译器将它们视为 ObjC 与标头相
  • 在Eclipse中用subversion填充@version标签

    我想在 Eclipse 中使用 Subclipse 或 Subversion 填充注释标签 version CVS 会自动完成此操作 但 Subversion 不会 这会很有帮助 我尝试用谷歌搜索 version 但似乎不可能 CVS 所做
  • Puppeteer:如何单击元素以便在新选项卡中打开?

    我有一个包含 25 个可点击元素的列表 我需要在新选项卡中打开它们中的每一个 抓取在新选项卡中打开的新页面 然后将其关闭 然后转到下一个元素 并对列表中的每个元素执行相同的操作 但是 我在通过单击链接在新选项卡中打开链接时遇到问题 然后我设
  • 验证 mongoose 中父级范围内嵌入文档的唯一性

    我在猫鼬中有以下架构 UserSchema new Schema username type String required true GameSchema new Schema identifier String users UserSc
  • 是否可以防止从网站下载视频

    是否可以防止网站上的视频被下载 虽然用户可以使用某些硬件设备录制视频 但不可能使用某些链接下载视频 就像谷歌视频一样 例如 如果我的系统中有 Real One Player 我可以选择下载视频 这应该受到限制 是的 永远不要向任何人展示它
  • 核心数据实体继承 --> 限制?

    我想我会把这个发布到社区 我正在使用 coredata 并且有两个实体 两个实体都具有层级关系 我现在注意到有很多重复的功能 并且想知道是否应该重新构建一个抽象的基本实体 HierarchicalObject 并让我的实体继承它们 所以问题
  • JavaScript 中的三元运算符具有多个表达式?

    the styles the styles appendTo head the styles null the styles stylesheet detach 显然 这是无效的 注意 在 之间appendTo and the styles
  • python:获取长度为N的空格字符串的最简单方法

    在Python中生成长度为N的空格字符串的最简单方法是什么 除了像这样的东西 它是多行的 并且对于大 n 来说可能效率低下 def spaces n s for i in range n s return s 试试这个 简单 只有一行 n
  • 对角线使用 putText() ?使用 OpenCV

    是否可以使用 putText 方法在图片上对角线绘制文本 如果没有 除了使用 addWeighted 将两张图片混合在一起 其中一张是对角放置的文本 之外 还有其他选择吗 我正在尝试在图片上放置文本水印 我的问题是现在我正在使用 addWe
  • 理解 jq JOIN()

    我试图理解JOIN 内置于jq 来自 jq 手册 https stedolan github io jq manual JOIN idx stream idx expr join expr This builtin joins the va