如何在MarkLogic中过滤删除非JSON文档并解决mlcp URI提取报错问题
MarkLogic 常见问题处理方案
1. 非JSON无效二进制数据的筛选与删除
可以通过Server-Side JavaScript直接实现筛选删除,建议先执行查询校验待删除数据,确认无误后再执行删除操作,参考代码如下:
// 筛选符合条件的待删除文档URI const toDeleteUris = cts.uris("", [], cts.andQuery([ cts.directoryQuery("/foo/bar/"), cts.notQuery(cts.documentQuery(cts.uriMatch("/foo/bar/*.json"))) ])).toArray(); // 可选:增加二进制文档校验,避免误删其他格式合法文档 const filteredUris = toDeleteUris.filter(uri => { const doc = fn.doc(uri); return xdmp.nodeKind(doc) === "binary"; }); // 执行删除,确认待删列表无误后再取消注释执行 // xdmp.documentDelete(filteredUris);
如果数据量较大,建议使用 xdmp.spawn 分批执行删除,避免单事务超时。
2. mlcp 提取含?的URI文件的解决方案
mlcp 默认会将URI中的?识别为查询参数分隔符,且本地文件系统不允许文件名包含?,因此导出时会报错,可通过以下步骤解决:
- 导出时添加自定义转换模块,将URI中的
?转义为合法字符(如%3F),同时将原URI存入文档元数据中,避免丢失原始URI信息 - mlcp 导出命令添加
-strict_uri false参数,关闭严格URI校验,避免URI特殊字符触发报错 - 若后续需要重载数据到数据库,导入时添加转换逻辑读取元数据中的原始URI,恢复为带
?的格式即可
如果不需要保留原始URI,可直接在导出转换中把?替换为其他合法字符(如下划线),无需额外存储元数据。
内容的提问来源于stack exchange,提问作者Mehul
相关产品推荐
相关产品推荐

