如何删除具有特定属性的所有RavenDB文档

时间:2017-02-06 17:37:04

标签: ravendb

我需要以编程方式删除一堆文档。我可以使用UI中的javascript“补丁”功能来查找这些文档,并添加一个属性来识别它们,如下所示:

if (__document_id.indexOf("baddata") > 0) {
   this.'MakeThisGoAway' = true;
}

但我找不到删除“补丁”中文档的方法。 (按照设计我假设)

从Raven文档来看,正确执行此操作的正确方法是通过curl发出DELETE请求,如下所述:https://ravendb.net/docs/article-page/3.5/http/client-api/commands/documents/how-to/delete-or-update-documents-using-index请求如下:

curl -X DELETE "http://localhost:8080/databases/NorthWind/bulk_docs/Raven/DocumentsByEntityName?&query=Tag%3AShops&allowStale=false" 

但唯一的例子是删除集合中的所有文档。看起来我应该能够包含像“propertyname = MakeThisGoAway& value = true”这样的查询,但我在文档中找不到具体的工作方式。我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

我想到这一点,我错过了一些步骤,并且对于lucene查询的语法也很模糊。

如果它对任何人有帮助,请执行以下全部步骤,以便批量删除Ravendb文档:

  1. 如果您需要删除历史文档,请从版本控制中排除集合。如果你不这样做,Raven将不会让你删除文件" Raven-Document-Revision-Status":" Historical"。转到系统文档,找到Raven / Versioning / CollectionYouWant,并设置"排除"真实。

  2. 转到Documents / Patch,选择Collection,选择所需的Collection,然后编写一个补丁脚本,为要删除的数据添加一个标志字段。 (如果要删除对某个字段具有特定值的所有文档,则可以跳过此步骤。此外,如果此数据是只读的,则需要将其设置为false。示例补丁脚本:

    // wrap with a conditional to only affect the data that meets your criteria
    if (this.baddata == 1 || __document_id.indexOf("baddata") > 0) {
        // remove Raven-Read-Only, or the delete will fail
        this['@metadata']['Raven-Read-Only'] = false;  
        // add a flag field to identify the documents you will be deleting
        this.MakeThisGoAway = true;
    }
    
  3. 将您刚刚创建的字段添加到索引中。转到索引,点击铅笔按钮,然后添加" MakeThisGoAway = doc.MakeThisGoAway"到其地图中的select语句。然后保存,并通过在工作室中重新打开索引并执行"索引条目"来强制重新索引。在齿轮图标下。

  4. 使用curl或postman将DELETE发送到以下位置,删除包含您添加的标记字段的所有文档:

    http://ravenserver:8080/databases/DbName/bulk_docs/This/Is/Your/Index?query="MakeThisGoAway:true"
    
  5. 检查以确保您想要的文件消失了。如果一切顺利,可以通过从索引中删除flag属性,然后将Versioning文档设置回Exclude:false来整理。