mem update api中的MarkLogic覆盖内存中保留的上一个条目

mem update api中的MarkLogic覆盖内存中保留的上一个条目,marklogic,sjs,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) {

我想使用循环从文档中删除多个节点,并使用内存中的更新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保留在文档中。可能内存中的版本3覆盖了版本2的删除

我在这里遗漏了什么?

此解决方案有效:

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和MarkLogic 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;

我使用的是marklogic 8版本,我认为8不支持'Sequence.from()。