programing

Query Explorer를 통해 조건에 따라 CosmosDB에서 문서 삭제

linuxpc 2023. 4. 21. 20:18
반응형

Query Explorer를 통해 조건에 따라 CosmosDB에서 문서 삭제

컬렉션의 where 조건과 일치하는 모든 문서를 삭제하는 쿼리 또는 다른 빠른 방법은 무엇입니까?
나는 이런 것을 원한다.DELETE * FROM c WHERE c.DocumentType = 'EULA'효과가 없는 것 같아요

주의: C#의 실장은 필요 없습니다.

이것은 조금 낡았지만, 같은 요건을 가지고 있었기 때문에, @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 포털에 접속하여 위에서 스크립트를 가져와 삭제해야 할 데이터베이스 컬렉션에 새로운 저장 프로시저를 만듭니다.

그런 다음 저장 프로시저 창의 바로 아래에 있는 스크립트 텍스트 영역 아래에는 매개 변수를 넣는 위치가 있습니다.제 경우 모두 삭제하고 싶기 때문에 다음을 사용했습니다.

SELECT c._self FROM c

내 생각에 너는 다음과 같다.

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

그런 다음 '저장 후 실행'을 누릅니다.비올라, 일부 문서는 삭제됐어Azure Portal에서 작업한 후 Azure 문서를 전환했습니다.DB Studio에서 무슨 일이 일어나고 있는지 더 잘 볼 수 있었습니다.즉, 한 번에 18개를 삭제하도록 억제된 것을 알 수 있었습니다(결과에 반환됨).어떤 이유에서인지 애저 포털에서는 볼 수 없었습니다.

어쨌든 실행당 삭제 횟수가 일정 정도로 제한되더라도 매우 편리합니다.SP의 실행도 억제되어 있기 때문에 키보드를 으깨기만 할 수 없습니다.삭제할 수 있는 개수의 문서가 없는 한 컬렉션을 삭제하고 재작성합니다(500 미만).

위 링크에서 스크립트를 공유하기 위해 Mimi Gentz @Microsoft에 제공.

HTH

나는 DELETE * FROM C WHERE c 같은 것을 원한다.문서= 'EULA'를 입력하지만 작동하지 않는 것 같습니다.

이 방법으로 문서를 삭제하는 것은 지원되지 않습니다.먼저 SELECT 쿼리를 사용하여 문서를 선택한 후 별도로 삭제해야 합니다.필요한 경우 저장 프로시저에서 가져오기 및 삭제 코드를 작성한 후 저장 프로시저를 실행할 수 있습니다.

모든 문서를 나열하고 모든 문서를 삭제하는 스크립트를 작성했는데, 선택한 문서를 삭제하도록 수정할 수도 있습니다.

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;
}

또, C#/Dotnet Core 로 하고 싶은 경우는, https://github.com/lokijota/CosmosDbDeleteDocumentsByQuery 를 참조해 주세요.이것은 SELECT 쿼리를 지정하는 단순한 Visual Studio 프로젝트이며, 모든 일치는 a) 파일에 백업되고 b) 플래그 세트에 따라 삭제됩니다.

컬렉션에 저장 프로시저를 생성하고 삭제할 조건이 있는 선택 쿼리를 전달하여 실행합니다.이 저장된 proc를 사용하는 주된 이유는 RU를 대폭 줄이고 비용을 절감할 수 있는 지속 토큰 때문입니다.

##### Here is the python script which can be used to delete data from Partitioned Cosmos Collection #### This will delete documents Id by Id based on the result set data.

Identify the data that needs to be deleted before below step

res_list = "select id from id_del"
res_id = [{id:x["id"]} 
             for x in sqlContext.sql(res_list).rdd.collect()]
config = {
   "Endpoint" : "Use EndPoint"
  "Masterkey" : "UseKey", 
      "WritingBatchSize" : "5000",
    'DOCUMENTDB_DATABASE': 'Database',
    'DOCUMENTDB_COLLECTION': 'collection-core'
}; 

for row in res_id:
# Initialize the Python DocumentDB client
  client = document_client.DocumentClient(config['Endpoint'], {'masterKey': config['Masterkey']})

# use a SQL based query to get   documents

## Looping thru partition to delete

  query = { 'query': "SELECT c.id FROM c where c.id = "+ "'" +row[id]+"'"   }
  print(query)
  options = {}
  options['enableCrossPartitionQuery'] = True
  options['maxItemCount'] = 1000
  result_iterable = client.QueryDocuments('dbs/Database/colls/collection-core', query, options)
  results = list(result_iterable)
  print('DOCS TO BE DELETED : ' + str(len(results)))
  if len(results) > 0 :
      for i in range(0,len(results)):
      #  print(results[i]['id'])
          docID = results[i]['id']
          print("docID :" + docID)
          options = {}
          options['enableCrossPartitionQuery'] = True
          options['maxItemCount'] = 1000
          options['partitionKey'] = docID
          client.DeleteDocument('dbs/Database/colls/collection-core/docs/'+docID,options=options)
          print ('deleted Partition:' +  docID)

언급URL : https://stackoverflow.com/questions/44774835/delete-documents-from-cosmosdb-based-on-condition-through-query-explorer

반응형