【问题标题】:marklogic use node.js client api query doc with sub elementmarklogic 使用带有子元素的 node.js 客户端 api 查询文档
【发布时间】:2018-09-26 02:29:08
【问题描述】:

我将 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 的文档?

【问题讨论】:

    标签: node.js marklogic marklogic-9


    【解决方案1】:

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

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

    此查询与 parentCompany 属性下的任意位置的 name 属性匹配。此类查询等效于服务器端 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

    希望对您有所帮助,

    【讨论】:

    • 我尝试qb.scope,但它不起作用。然后,我找到this。我添加withOptions({search:'filtered'}) 这是最后的工作。 qb.pathIndex 还是不行。我应该为数据库设置什么吗?比如路径范围索引。
    • 是的,路径索引查询仅在存在路径范围索引时才有效。范围查询是否因为误报而不起作用?如果是这样,在数据库配置中打开元素值位置的索引可能会消除过滤的需要。过滤适用于实验和小型结果集,但不适用于大型结果集。
    • qb.pathIndex 还是不行,但是qb.scope 可以解决我的问题。谢谢。
    【解决方案2】:

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

    • 标量类型:字符串
    • 路径表达式:公司/父公司/名称

    您可以在管理界面中的 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多