marklogic использует клиентский API-запрос node.js с подэлементом

Я использую 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.name и company.parentCompany.name.

Как я могу использовать BuilderQuery для поиска документа с company.parentCompany.name?


person totem    schedule 26.09.2018    source источник


Ответы (2)


Один из подходов заключается в указании области действия запроса:

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

Этот запрос соответствует свойству name в любом месте под свойством parentCompany. Такие запросы эквивалентны функции cts.jsonPropertyScopeQuery() в серверном JavaScript. Дополнительные сведения о функции построителя запросов области см. в следующих статьях:

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

Альтернатива индекса диапазона пути задает явный путь вместо связи области. Если отношения масштаба недостаточно для устранения ложных срабатываний, это правильный путь. Как отмечает Вагнер, обязательным условием является наличие дополнительного индекса. Запрос будет выглядеть следующим образом:

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

Надеясь, что это поможет,

person ehennum    schedule 26.09.2018
comment
Я пытаюсь qb.scope, но это не работает. затем я нахожу это. Добавляю withOptions({search:'filtered'}) Это итоговая работа. qb.pathIndex все еще не работает. Должен ли я установить что-либо в базу данных? Например, индексы диапазона путей. - person totem; 27.09.2018
comment
Да, запрос индекса пути работает, только если существует индекс диапазона пути. Запрос области не работает из-за ложных срабатываний? Если это так, включение индексации позиций значений элементов в конфигурации базы данных может устранить необходимость в фильтрации. Фильтрация подходит для экспериментов и небольшого набора результатов, но не масштабируется до огромных наборов результатов. - person ehennum; 27.09.2018
comment
qb.pathIndex все еще не работает, но qb.scope может решить мою проблему. Спасибо. - person totem; 03.10.2018

Вы можете добавить указатель диапазона путей на name и выполнить запрос с помощью pathRangeQuery, чтобы получить ваши документы. Ваш индекс диапазона пути будет выглядеть примерно так:

  • скалярный тип: строка
  • выражение пути: компания/родительская компания/имя

Вы можете добавить индекс диапазона пути в интерфейсе администратора в разделе databases/your-db/Path Range Indexes.

После добавления индекса этот xquery должен получить ваши документы:

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

Извините за отсутствие примера кода javascript, но я еще не использовал API-интерфейс nodejs.

person Wagner Michael    schedule 26.09.2018