通过Query Explorer从条件中删除CosmosDB中的文档

Jer*_*yal 14 azure azure-cosmosdb

什么是查询或其他一些快速方法来删除集合中where条件匹配的所有文档?
我想要的东西,DELETE * FROM c WHERE c.DocumentType = 'EULA'但显然,它不起作用.

注意:我不是在寻找任何C#实现.

Gau*_*tri 14

我想要像DELETE*FROM c WHERE c.DocumentType ='EULA'之类的东西,但显然它不起作用.

不支持以这种方式删除文档.您需要先使用SELECT查询选择文档,然后单独删除它们.如果需要,可以编写用于在存储过程中获取和删除的代码,然后执行该存储过程.


Ben*_*E G 12

这有点旧,但只是有相同的要求,并找到了@Gaurav Mantri所写的具体例子.

存储过程脚本在这里:

https://social.msdn.microsoft.com/Forums/azure/en-US/ec9aa862-0516-47af-badd-dad8a4789dd8/delete-multiple-docdb-documents-within-the-azure-portal?forum=AzureDocumentDB

转到Azure门户,从上面获取脚本,并在需要删除的database-> collection中创建一个新的存储过程.

然后在存储过程窗格的底部,脚本textarea下面是放入参数的位置.在我的情况下,我只想删除所有,所以我用过:

"SELECT c._self FROM c"

我猜你的是:

"SELECT c._self FROM c WHERE c.DocumentType ='EULA'"

然后点击"保存并执行".Viola,一些文件被删除.在Azure门户中工作之后,我切换了Azure DocumentDB Studio,更好地了解了发生的情况.即我可以看到我被限制删除18次(在结果中返回).出于某种原因,我无法在Azure门户中看到这一点.

无论如何,即使每次执行仅限于一定数量的删除,也非常方便.执行sp也会受到限制,因此您不能仅仅粘贴键盘.我想我会删除并重新创建Collection,除非我有一个可管理的文件要删除(思考<500).

Mimi Gentz @Microsoft的道具在上面的链接中共享脚本.

HTH

  • 感谢这一点,当您需要针对单个分区运行它时,它会很有帮助。但是,如果查询本身是跨分区的,则存储过程选项不可行,因为您当前只能针对分区运行存储过程。 (3认同)

小智 8

我写了一个脚本来列出所有文件并删除所有文件,它可以修改为删除选定的文件。

var docdb = require("documentdb");
var async = require("async");

var config = {
  host: "https://xxxx.documents.azure.com:443/",
  auth: {
    masterKey: "xxxx"
  }
};

var client = new docdb.DocumentClient(config.host, config.auth);

var messagesLink = docdb.UriFactory.createDocumentCollectionUri("xxxx", "xxxx");

var listAll = function(callback) {
  var spec = {
    query: "SELECT * FROM c",
    parameters: []
  };

  client.queryDocuments(messagesLink, spec).toArray((err, results) => {
    callback(err, results);
  });
};

var deleteAll = function() {
  listAll((err, results) => {
    if (err) {
      console.log(err);
    } else {
      async.forEach(results, (message, next) => {
        client.deleteDocument(message._self, err => {
          if (err) {
            console.log(err);
            next(err);
          } else {
            next();
          }
        });
      });
    }
  });
};

var task = process.argv[2];
switch (task) {
  case "listAll":
    listAll((err, results) => {
      if (err) {
        console.error(err);
      } else {
        console.log(results);
      }
    });
    break;
  case "deleteAll":
    deleteAll();
    break;

  default:
    console.log("Commands:");
    console.log("listAll deleteAll");
    break;
}
Run Code Online (Sandbox Code Playgroud)

  • 欢迎使用堆栈溢出!虽然链接是分享知识的好方法,但如果它们将来被破坏,它们将无法真正回答问题。将回答问题的链接的基本内容添加到您的答案中。如果内容太复杂或太大而无法在此处显示,请描述所提议解决方案的总体思路。请记住始终保留原始解决方案网站的链接引用。请参阅:[如何写出好的答案?](https://stackoverflow.com/help/how-to-answer) (5认同)