basex "使用$ input的内容替换数据库$ db中由$ path指定的资源,或将其添加为新资源"。
Database_Module db:replace文档建议"具有相同路径的文档可能在数据库中出现多次。如果要强制执行单个实例,请使用db:replace代替。"
鉴于我不理解我接下来的结果
我有一些xml文档集合,其中包含
等项目declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
for $file in file:list("/mnt/06_08_2016_08_50_20/XML/", false(), "*.xml")
let $doc := doc(concat("/mnt/06_08_2016_08_50_20/XML/", $file))
for $item in $doc//item
return
let $file := replace(concat($item/@CRD,$item/@PRIMARYNAME,$item/@LEGALNAME,$item/@STATE,$item/@COUNTRY,'.xml'),'\s+','')
return db:replace('FOIA', $file, $item)
我使用以下xquery读取集合中的每个文件,使用从item属性构造的文件名保存每个项目,以便仅使用db:replace命令保存对这些属性列表唯一的项目
let $items := //item[@CRD ='170562']
for $item in $items
return fn:base-uri($item)
根据我的查询
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
即使只有两个唯一的文件名,也会创建28个xml文件。
FOIA/170562LAUNCHANGELSNHUS.xml
FOIA/170562LAUNCHANGELSMAUS.xml
我希望数据库中只存在2个文件,这些名称在使用db时不是28个:替换为插入
Const Compare_Files As String = "Table2"
Const SQL_UPDATE_DATA As String = "SELECT * FROM [" & Compare_Files & "] WHERE F2 Is Null"
Dim rs As DAO.Recordset
Dim strF1Data As String
Dim varData As Variant
Set rs = CurrentDb.OpenRecordset(SQL_UPDATE_DATA)
With rs
Do Until .EOF
strF1Data = !F1
varData = Split(strF1Data, ";")
If UBound(varData) = 4 Then
.Edit
!F1 = varData(0)
!F2 = varData(1)
!F3 = varData(2)
!F4 = varData(3)
!F5 = varData(4)
.Update
End If
.MoveNext
Loop
.Close
End With
Set rs = Nothing
我确实想强制执行单个实例,所以我做错了什么。
非常感谢
答案 0 :(得分:1)
感谢您的观察,听起来像一个错误。应尽快修复(有关详细信息,请参阅https://github.com/BaseXdb/basex/issues/1302。)
修复此问题后,您的查询可能会触发错误(因为您尝试多次写入同一位置,所有其他XQuery Update表达式都不允许这样做)。分组将起到作用:
declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
for $file in file:list("/mnt/06_08_2016_08_50_20/XML/", false(), "*.xml")
let $doc := doc(concat("/mnt/06_08_2016_08_50_20/XML/", $file))
for $item in $doc//item
group by $file := replace(concat($item/(@CRD,@PRIMARYNAME,@LEGALNAME,@STATE,@COUNTRY),'.xml'),'\s+' ,'')
return db:replace('FOIA', $file, $item[1])
答案 1 :(得分:0)
我最终根据Christian的反馈做了以下操作,在添加到数据库之前,首先检查文件是否存在。
declare namespace db="http://basex.org/modules/db";
declare namespace file="http://expath.org/ns/file";
declare variable $path as xs:string external;
for $item in collection($path)//item
group by $filename := replace(concat($item/@CRD,$item/@PRIMARYNAME,$item/@LEGALNAME,$item/@STATE,$item/@COUNTRY,'.xml'),'\s+','')
return if (not(db:exists('FOIA', $filename))) then
db:replace('FOIA', $filename, $item[1])
else ( )