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;