MarkLogic Optic API,存在使用空限定符加入数据选择,导致“列引用不明确”错误

问题描述 投票:0回答:1

我遇到了以下情况 - 我使用 Optic API,我使用 containsJoin 将第一个视图按第二个视图进行过滤,以仅获取我想要的行集。然后,我需要将 op.on 定义中使用的属性(两个视图中存在相同的列)包含在我作为结果返回的对象中,此外,该属性必须在没有任何限定符等的情况下存在。

下面是最简单的代码,它模仿了我在我的应用程序中需要执行的操作(使用 TDE 创建的视图)。

const op = require('/MarkLogic/optic');
const testViewToFilter = op.fromLiterals([
  {id:1000, val: 10},
  {id:1001, val: 11},
  {id:1002, val: 12}
], 'testViewToFilter');
const filteringView = op.fromLiterals([{id:1000}], 'filteringView')
testViewToFilter
  .existsJoin(
    filteringView,
    op.on(
      testViewToFilter.col('id'),
      filteringView.col('id')
    )
  )
  .select([testViewToFilter.col('id')], '')
  .result()

我的期望:

[{id: 1000}]

我得到了什么:

[javascript] SQL-AMBCOLUMN: return plan.execute(query); -- Ambiguous column reference: found filteringView.id and id

我做错了什么吗?我怎样才能达到我期望的结果? 我不明白为什么我会在

id
列中得到 Ambiguous column reference

我对 MarkLogic 版本得到相同的结果:

10.0-9.2
10.0-9.5

marklogic marklogic-10 marklogic-optic-api
1个回答
1
投票

这是有趣的光学 API 细微差别之一。一旦某个列多次使用同一个名称(即使使用限定符),那么将来您将无法创建任何具有非限定名称的列。

如果我有:

foo.id
bar.id
我无法创建
id

错误是在

id
 行中创建了 
.select([testViewToFilter.col('id')], '')

您有两个选择:

  1. 新的预选赛:

    .select([testViewToFilter.col('id')], 'filleMeIN')

    导致

    {"filleMeIN.id": 1000}

  2. 重新定义列名:

    .select([op.as("newId", testViewToFilter.col('id'))], '')

    导致

    {"newId": 1000}

小提示:这与语言无关。使用 xQuery 时也存在同样的细微差别

© www.soinside.com 2019 - 2024. All rights reserved.