marklogic 使用 node.js client api query doc with sub element

marklogic use node.js client api query doc with sub element

我将 marklogic 9 与 Node.js 客户端 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 的文档?

您可以添加 path range index on name and query with pathRangeQuery 来获取您的文件。 您的路径范围索引看起来类似于:

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

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

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

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

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

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

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

希望对您有所帮助,