我想按元数据属性" 最后修改"对文档进行排序。我已经在" 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.' }
} }
答案 0 :(得分:4)
更新:澄清片段说明;修复示例
last-modified
属性(由maintain last modified
设置控制)不存储在文档中,但在文档中属性,这是与每个文档关联的元数据片段。在MarkLogic Node.js API中,您可以使用qb.documentFragment()
或qb.propertiesFragment()
将查询约束到文档或文档属性。
但是,您只能按要返回的数据的方面进行排序:默认情况下,文档本身。您可以使用qb.fragmentScope()
指定查询返回documents
或properties
。
注意:文档属性作为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); })
});