MarkLogic内存中更新api会覆盖保存在内存中的先前条目

时间:2018-07-16 12:22:25

标签: marklogic sjs

我想使用循环从文档中删除多个节点,并使用内存中更新API将更新后的文档保存在内存中。下面是我正在使用的代码:

var mem = require("/MarkLogic/appservices/utils/in-mem-update.xqy");
var myDoc = cts.doc("abc.xml");
var nodeArr = [];
nodeArr = myDoc.xpath("/document/version").toArray();
for (i in nodeArr)
{
  if(nodeArr[i].xpath('@id')!= "1"){
    myDoc = mem.nodeDelete(nodeArr[i])
  }
}
myDoc;

假设我的文档中有3个版本,并且我想删除id=1以外的版本。以下代码的结果是仅删除版本3并将版本2保留在文档中。内存中的版本2可能被版本3覆盖。

我在这里想念什么?

1 个答案:

答案 0 :(得分:3)

此解决方案有效:

var mem = require("/MarkLogic/appservices/utils/in-mem-update.xqy");
var myDoc = cts.doc("abc.xml");
var nodeArr = [];
var track = [];
nodeArr = myDoc.xpath("/document/version").toArray();
for (i in nodeArr)
{
  if(nodeArr[i].xpath('@id')!= "1"){
    track.push(nodeArr[i]);
  }
}
myDoc = mem.nodeDelete(Sequence.from(track));
myDoc;

问题在于mem.nodeDelete仅从实例化节点时就从文档状态中删除该节点。可以认为它就像是在内存中制作了文档的副本,而您只是从该节点的唯一副本中删除了该节点。解决方法是确保从同一副本中删除所有节点。有点混乱,但希望这段代码有助于阐明它的应用。

编辑,这是一种可在MarkLogic 8和9上使用的替代方法:

var mem = require("/MarkLogic/appservices/utils/in-mem-update.xqy");
var myDoc = cts.doc("abc.xml");
var id = 0;
for (i in myDoc.xpath("/document/version").toArray())
{
  var nodeArr = myDoc.xpath("/document/version").toArray()[id];
  if(nodeArr.xpath('@id')!= "1"){
    myDoc = mem.nodeDelete(nodeArr);
  }
  else id++;
}
myDoc;