MarkLogic Node.js排序"最后修改"

时间:2015-05-07 03:24:13

标签: node.js marklogic

我想按元数据属性" 最后修改"对文档进行排序。我已经在" last-modified"上创建了元素范围索引。并启用了选项" 维护上次修改"在数据库的管理面板中。但是,当我在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.' }
} }

1 个答案:

答案 0 :(得分:4)

更新澄清片段说明;修复示例

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

但是,您只能按要返回的数据的方面进行排序:默认情况下,文档本身。您可以使用qb.fragmentScope()指定查询返回documentsproperties

注意:文档属性作为XML存储在http://marklogic.com/xdmp/property命名空间中,因此您的element-range-index也必须使用该命名空间。

以下是获取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()匹配的任何查询进一步限制这些结果:

假设int上的test范围索引:

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); })
});