我想在沒有任何元數據(例如權限,屬性或集合)的情況下替換數據庫中的xml文檔。託管文檔(dls)不是一個選項。更新marklogic中整個文檔的最佳方法
使用xdmp:document-insert()
不保留權限,收藏等
使用xdmp:node-replace()
作品以及與文檔的部分,但需要預先知道根節點。
有推薦的方法來更新MarkLogic中的整個文檔嗎?
我想在沒有任何元數據(例如權限,屬性或集合)的情況下替換數據庫中的xml文檔。託管文檔(dls)不是一個選項。更新marklogic中整個文檔的最佳方法
使用xdmp:document-insert()
不保留權限,收藏等
使用xdmp:node-replace()
作品以及與文檔的部分,但需要預先知道根節點。
有推薦的方法來更新MarkLogic中的整個文檔嗎?
你並不需要知道根元素本身。如果你知道文檔的URI,你可以這樣做:
xdmp:node-replace(fn:doc($uri)/*, $new-xml)
如果您有文檔的任何節點上,你也可以這樣做:
xdmp:node-replace($node/fn:root(), $new-xml)
但是僅僅使用xdmp:document-insert()
不算多更難:
xdmp:document-insert($uri, $new-xml, xdmp:document-get-permissions($uri), xdmp:document-get-collections($uri), xdmp:document-get-quality($uri))
注意:文檔屬性保存在文檔插入。另請參閱:http://docs.marklogic.com/xdmp:document-insert
此外,這些方法之間沒有太多性能差異。這方面最大的區別在於xdmp:node-replace()
需要來自原始文檔的節點,這意味着它必須首先從數據庫中檢索。如果替換不取決於原始文檔,那麼xdmp:document-insert()
將是最快的。
HTH!
+1 to @grtjn。請注意,爲什麼使用xdmp:node-replace沒有效率,那麼xdmp:document-insert是所有文檔更新都會更新整個文檔。 xdmp:node-replace的操作類似於說RDBMS字段更新是一種常見的可以理解的誤解 - 只是「觸及」受影響的字段。在RDBMS的情況下,這也經常是錯誤的誤解。
類似於不需要讀取舊文檔主體,如果您知道權限,集合和質量應該是什麼,您可以提供這些(或默認值),而不是使用xdmp查詢它們:document-get-permissions()等等。它可能不會產生可測量的差異,但是與xdmp:node-replace()一樣,如果您不需要查詢某個值,則更簡單 - 不會刪除不必要的依賴項和錯誤機會(例如,如果文檔不存在嗎?)