Marklogic Optic API:如何获取带有最大值的列的值?

Marklogic Optic API:如何获取带有最大值的列的值?,marklogic,Marklogic,我的数据集有两个数组,其中包含具有两个属性(日期和值)的对象。对于每个数组,我需要获取具有最新日期的对象。我正试图从索引中实现这一点,并正在探索如何使用opticapi进行查询 我的视图有三列:“statusType”,指示值来自哪个数组;“状态日期”;和“价值”。通过下面的查询,我可以获得每种类型的最新日期,但我不知道如何获得相应的值 const op=require('/MarkLogic/optic'); op.fromView('父','信息') .where(cts.documentQ

我的数据集有两个数组,其中包含具有两个属性(日期和值)的对象。对于每个数组,我需要获取具有最新日期的对象。我正试图从索引中实现这一点,并正在探索如何使用opticapi进行查询

我的视图有三列:“statusType”,指示值来自哪个数组;“状态日期”;和“价值”。通过下面的查询,我可以获得每种类型的最新日期,但我不知道如何获得相应的值

const op=require('/MarkLogic/optic');
op.fromView('父','信息')
.where(cts.documentQuery('/test/doc1.json'))
.groupBy([op.col('statusType')],[op.max('maxdate',op.col('statusDate'))]))
.result()
产生:

{
“状态类型”:“子类型1”,
“maxdate”:“2020-09-29T16:33:18.6301434-04:00”
},
{
“状态类型”:“子类型2”,
“maxdate”:“2020-08-29T16:33:18.6301434-04:00”
}
如果我将
value
添加到
groupBy
的第一个参数中,我会得到类型和值的所有不同组合(使用maxdate)。如果将
value
添加到
groupBy
的第二个参数中,则得到的是最后一个值,而不是与
maxdate
关联的值

预期产出:

{
“状态类型”:“子类型1”,
“价值”:“价值B”,
“maxdate”:“2020-09-29T16:33:18.6301434-04:00”
},
{
“状态类型”:“子类型2”,
“价值”:“价值C”,
“maxdate”:“2020-08-29T16:33:18.6301434-04:00”
}
样本数据:

“严格使用”;
宣布更新();
xdmp.documentInsert(
“/test/doc1.json”,
{
“家长”:{
“子类型1”:[
{
“价值”:“价值A”,
“日期”:“2020-07-29T16:33:18.6301434-04:00”
}, 
{
“价值”:“价值B”,
“日期”:“2020-09-29T16:33:18.6301434-04:00”
}
], 
“第2款”:[
{
“价值”:“价值C”,
“日期”:“2020-08-29T16:33:18.6301434-04:00”
}, 
{
“价值”:“有价值的”,
“日期”:“2020-07-29T16:33:18.6301434-04:00”
}
]
}
}
)
模板1:

declareUpdate();
const tde=require(“/MarkLogic/tde.xqy”);
让模板=
xdmp.toJSON(
{
“模板”:{
“上下文”:“/父级/子级1”,
“行”:[
{
“schemaName”:“父项”,
“视图名称”:“信息”,
“栏目”:[
{
“名称”:“状态类型”,
“scalarType”:“字符串”,
“val”:“子类型1”
},
{
“名称”:“值”,
“scalarType”:“字符串”,
“val”:“value”
},
{
“名称”:“状态日期”,
“scalarType”:“dateTime”,
“val”:“日期”
}
]
}
]
}
}
);
//根据要执行的操作进行注释和取消注释
让行动=
//“验证”
//“摘录”
“插入”
;
如果(操作=='validate'){
tde.验证([模板]);
}else if(action==='extract'){
tde.nodeDataExtract([cts.doc(“/test/doc1.json”)],[template])
}else if(操作==='insert'){
templateInsert(“/tde/subtyp1.json”,模板,xdmp.defaultPermissions(),[“tde”])
}
模板2:

declareUpdate();
const tde=require(“/MarkLogic/tde.xqy”);
让模板=
xdmp.toJSON(
{
“模板”:{
“上下文”:“/父级/子级2”,
“行”:[
{
“schemaName”:“父项”,
“视图名称”:“信息”,
“栏目”:[
{
“名称”:“状态类型”,
“scalarType”:“字符串”,
“val”:“subsub2”
},
{
“名称”:“值”,
“scalarType”:“字符串”,
“val”:“value”
},
{
“名称”:“状态日期”,
“scalarType”:“dateTime”,
“val”:“日期”
}
]
}
]
}
}
);
//根据要执行的操作进行注释和取消注释
让行动=
//“验证”
//“摘录”
“插入”
;
如果(操作=='validate'){
tde.验证([模板]);
}else if(action==='extract'){
tde.nodeDataExtract([cts.doc(“/test/doc1.json”)],[template])
}else if(操作==='insert'){
templateInsert(“/tde/subtyp2.json”,模板,xdmp.defaultPermissions(),[“tde”])
}

卡塞尔先生,您好:

如果我正确理解了需求,我知道的唯一方法就是将
groupBy()
结果与原始视图连接起来:

  • groupBy()
    发出带有分组键和max()聚合值的行,在
    fromView()访问器上传递别名/限定符名称
  • 通过使用相同的视图连接(连接键位于maxInfo.statusType=info.statusType和maxInfo.maxdate=info.statusDate上),获取max行的其余列
  • groupBy()
    操作对聚合参数中的任何列进行采样

    希望有帮助