2016-01-30 49 views
3

我想在沒有任何元數據(例如權限,屬性或集合)的情況下替換數據庫中的xml文檔。託管文檔(dls)不是一個選項。更新marklogic中整個文檔的最佳方法

使用xdmp:document-insert()不保留權限,收藏等

使用xdmp:node-replace()作品以及與文檔的部分,但需要預先知道根節點。

有推薦的方法來更新MarkLogic中的整個文檔嗎?

回答

8

你並不需要知道根元素本身。如果你知道文檔的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!

2

+1 to @grtjn。請注意,爲什麼使用xdmp:node-replace沒有效率,那麼xdmp:document-insert是所有文檔更新都會更新整個文檔。 xdmp:node-replace的操作類似於說RDBMS字段更新是一種常見的可以理解的誤解 - 只是「觸及」受影響的字段。在RDBMS的情況下,這也經常是錯誤的誤解。

類似於不需要讀取舊文檔主體,如果您知道權限,集合和質量應該是什麼,您可以提供這些(或默認值),而不是使用xdmp查詢它們:document-get-permissions()等等。它可能不會產生可測量的差異,但是與xdmp:node-replace()一樣,如果您不需要查詢某個值,則更簡單 - 不會刪除不必要的依賴項和錯誤機會(例如,如果文檔不存在嗎?)

相關問題