marklogic使用带有子元素的node.js客户端api查询文档

时间:2018-09-26 02:29:08

标签: node.js marklogic marklogic-9

我将marklogic 9与Node.js Client Api一起使用。当我尝试使用queryBuilder搜索文档时,发现一些问题。

这是我的文档数据

company: {
  uuid : uuid,
  name : comapnyName,
  parentCompany: {
    uuid: uuid,
    name: parentCompanyName,
  }
}

我想在母公司下找到所有公司,但不包括母公司。 我用

db.documents.query(
  this.qb.where(
    this.qb.directory('/company/'),
    this.qb.collection('company'),
    this.qb.word('name',parentCompanyName),
  )
).result();

此查询查找所有包含母公司的公司。 我认为它找到了company.namecompany.parentCompany.name

如何使用BuilderQuery通过company.parentCompany.name查找文档?

2 个答案:

答案 0 :(得分:0)

您可以在name上添加path range index并使用pathRangeQuery查询以获取文档。 您的路径范围索引看起来类似于:

  • 标量类型:字符串
  • 路径表达式:company / parentCompany / name

您可以在管理界面中的databases / your-db / Path Range Indexes下添加路径范围索引。

添加索引后,此xquery应该会获取您的文档:

cts:search(fn:doc(), 
  cts:and-query((
    cts:path-range-query("company/parentCompany/name", "=", "Company name")
  ))
)

很抱歉,没有javscript代码示例,但我尚未使用nodejs api。

答案 1 :(得分:0)

一种方法是为查询指定范围:

db.documents.query(
  qb.where(
    qb.directory('/company/'),
    qb.collection('company'),
    qb.scope('parentCompany', qb.word('name',parentCompanyName))
  )
).result();

此查询与name属性下任意位置的parentCompany属性匹配。这样的查询等效于服务器端JavaScript中的cts.jsonPropertyScopeQuery()函数。有关范围查询构建器功能的更多信息,请参见:

http://docs.marklogic.com/jsdoc/queryBuilder.html#scope

路径范围索引替代项指定显式路径而不是范围关系。如果范围关系不足以消除误报,那是正确的方法。正如Wagner指出的那样,前提条件是附加索引。该查询将类似于以下内容:

db.documents.query(
  qb.where(
    qb.directory('/company/'),
    qb.collection('company'),
    qb.word(qb.pathIndex('company/parentCompany/name'),parentCompanyName)
  )
).result();

有关pathIndex查询构建器功能的更多信息,请参见:

http://docs.marklogic.com/jsdoc/queryBuilder.html#pathIndex

希望有帮助,