MarkLogic Node.js 排序 "last-modified"

MarkLogic Node.js Sort on "last-modified"

我想按元数据 属性“last-modified”对文档进行排序。我已经在 "last-modified" 上创建了元素范围索引,并且还在 database.But 的管理面板中启用了选项“维护上次修改”,当我 [=26] =] 下面的语句 Node.js

return db.documents.query(
        qb.where().orderBy(qb.sort("last-modified")).slice(from, length)).result();

我遇到了以下错误。请帮忙?

 Error { [Error: query documents: response with invalid 400 status]
  message: 'query documents: response with invalid 400 status',
  statusCode: 400,
  body:
   { errorResponse:
      { statusCode: 400,
        status: 'Bad Request',
        messageCode: 'SEARCH-BADORDERBY',
        message: 'SEARCH-BADORDERBY: (err:FOER0000) Indexes are required to supp
ort element, element-attribute, json-property, or field sort specifications.' }
} }

更新澄清片段解释;固定示例

last-modified属性(由maintain last modified设置控制)存储在文档 本身,但在 文档属性 中,这是与每个文档关联的元数据片段。在 MarkLogic Node.js API 中,您可以使用 qb.documentFragment() or qb.propertiesFragment().

限制对文档或文档属性的查询

但是,您只能按所用数据的各个方面进行排序 return:默认情况下,文档本身。您可以使用 qb.fragmentScope().

指定您的查询 return documentsproperties

注意:文档属性在 http://marklogic.com/xdmp/property 命名空间中存储为 XML,因此您的元素范围索引也必须使用该命名空间。

以下是获取 10 个最新文档属性的方法:

return db.documents.query(
  qb.where(
    qb.fragmentScope('properties')
  ).orderBy(
    qb.sort(
      qb.element(qb.qname('http://marklogic.com/xdmp/property', 'last-modified')),
      'descending'
    )
  ).slice(1, 10))
.result();

您可以通过将文档本身与 qb.documentFragment():

相匹配的任何查询来进一步限制这些结果

假设在 test 上有一个 int 范围索引:

return db.documents.query(
  qb.where(
    qb.fragmentScope('properties'),
    qb.documentFragment(
      qb.range( qb.element('test'), '<', 20 )
    )
  ).orderBy(
    qb.sort(
      qb.element(qb.qname('http://marklogic.com/xdmp/property', 'last-modified')),
      'descending'
    )
  ).slice(1, 10))
.result();

最后,如果您想要获取文档本身,而不是它们的属性,您可以向 db.documents.read() 发出请求,并使用查询检索到的文档 URI:

注:以下示例使用lodash/underscore

return db.documents.query(
  qb.where(
    qb.fragmentScope('properties'),
    qb.documentFragment(
      qb.range( qb.element('test'), '<', 20 )
    )
  ).orderBy(
    qb.sort(
      qb.element(qb.qname('http://marklogic.com/xdmp/property', 'last-modified')),
      'descending'
    )
  ).slice(1, 10))
.result(function(documents) {
  db.documents.read(
    _.map(documents, 'uri')
  ).result(function(documents) {
    _.each(documents, function(doc) { console.log(doc.content); })
  });
});

或者,您的应用程序可以直接在文档中维护 last-modified 属性,在这种情况下,您的查询会简单得多:

return db.documents.query(
  qb.where(
    qb.range( qb.element('test'), '<', 20 )
  ).orderBy(
    qb.sort( qb.element('last-modified'), 'descending' )
  ).slice(1, 10))
.result(function(documents) {
  _.each(documents, function(doc) { console.log(doc.content); })
});