MarkLogic in-mem-update api 覆盖保存在内存中的先前条目
MarkLogic in-mem-update api overriding previous entry kept in memory
我想使用循环从文档中删除多个节点,并使用内存更新 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 覆盖。
我在这里错过了什么?
此解决方案有效:
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;
我想使用循环从文档中删除多个节点,并使用内存更新 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 覆盖。
我在这里错过了什么?
此解决方案有效:
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;