API-интерфейс MarkLogic in-mem-update переопределяет предыдущую запись, хранящуюся в памяти

Я хочу удалить несколько узлов из документа с помощью цикла и сохранить обновленный документ в памяти с помощью API-интерфейса in-memory-update. Ниже приведен код, который я использую:

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 ответ

Решение

Это решение работает:

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 удаляет только узел из состояния документа, как это было в момент создания экземпляра узла. Думайте об этом, как будто копия документа сделана в памяти, и вы только удаляете узел из уникальной копии этого узла. Чтобы обойти это, вы должны удалить все узлы из одной и той же копии. Это немного сбивает с толку, но, надеюсь, этот код поможет прояснить его применение.

Edit, вот альтернатива, которая должна работать на 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;
Другие вопросы по тегам