web-dev-qa-db-fra.com

Comment supprimer tous les documents dans DocumentDB via le code c #

J'utilise une nouvelle base de données de Microsoft appelée DocumentDB. Maintenant, je veux supprimer un document par ID, mais je ne sais pas comment faire. L'opération de suppression dans DocumentDB nécessite des auto-liens et ils sont différents de mes propres identifiants. Cependant, je demande une fois un document, puis j'obtiendrai le lien automatique. Avec ce lien automatique, je supprime le document.

Maintenant, je veux supprimer tous les documents autour de 50000+ documents dans ma collection.

Besoin d'obtenir chaque document puis de le supprimer ou toute autre méthode simple pour faire de même?

Est-ce possible?

16
satish kumar V

Vous avez raison de dire que la suppression de documents nécessite une référence au lien _self Du document.

Si vous cherchez à supprimer [~ # ~] tous les [~ # ~] documents de votre collection - il peut être plus simple et plus rapide de supprimer et -créer la collection. La seule mise en garde est que les scripts côté serveur (par exemple sprocs, udfs, triggers) appartiennent également à la collection et peuvent également avoir besoin d'être recréés.

pdate: J'ai écrit une procédure stockée rapide qui effectue une suppression en bloc à partir d'une requête. Cela vous permet d'effectuer des opérations de suppression en masse dans moins de demandes réseau.

/**
 * A DocumentDB stored procedure that bulk deletes documents for a given query.<br/>
 * Note: You may need to execute this sproc multiple times (depending whether the sproc is able to delete every document within the execution timeout limit).
 *
 * @function
 * @param {string} query - A query that provides the documents to be deleted (e.g. "SELECT * FROM c WHERE c.founded_year = 2008")
 * @returns {Object.<number, boolean>} Returns an object with the two properties:<br/>
 *   deleted - contains a count of documents deleted<br/>
 *   continuation - a boolean whether you should execute the sproc again (true if there are more documents to delete; false otherwise).
 */
function bulkDeleteSproc(query) {
    var collection = getContext().getCollection();
    var collectionLink = collection.getSelfLink();
    var response = getContext().getResponse();
    var responseBody = {
        deleted: 0,
        continuation: true
    };

    // Validate input.
    if (!query) throw new Error("The query is undefined or null.");

    tryQueryAndDelete();

    // Recursively runs the query w/ support for continuation tokens.
    // Calls tryDelete(documents) as soon as the query returns documents.
    function tryQueryAndDelete(continuation) {
        var requestOptions = {continuation: continuation};

        var isAccepted = collection.queryDocuments(collectionLink, query, requestOptions, function (err, retrievedDocs, responseOptions) {
            if (err) throw err;

            if (retrievedDocs.length > 0) {
                // Begin deleting documents as soon as documents are returned form the query results.
                // tryDelete() resumes querying after deleting; no need to page through continuation tokens.
                //  - this is to prioritize writes over reads given timeout constraints.
                tryDelete(retrievedDocs);
            } else if (responseOptions.continuation) {
                // Else if the query came back empty, but with a continuation token; repeat the query w/ the token.
                tryQueryAndDelete(responseOptions.continuation);
            } else {
                // Else if there are no more documents and no continuation token - we are finished deleting documents.
                responseBody.continuation = false;
                response.setBody(responseBody);
            }
        });

        // If we hit execution bounds - return continuation: true.
        if (!isAccepted) {
            response.setBody(responseBody);
        }
    }

    // Recursively deletes documents passed in as an array argument.
    // Attempts to query for more on empty array.
    function tryDelete(documents) {
        if (documents.length > 0) {
            // Delete the first document in the array.
            var isAccepted = collection.deleteDocument(documents[0]._self, {}, function (err, responseOptions) {
                if (err) throw err;

                responseBody.deleted++;
                documents.shift();
                // Delete the next document in the array.
                tryDelete(documents);
            });

            // If we hit execution bounds - return continuation: true.
            if (!isAccepted) {
                response.setBody(responseBody);
            }
        } else {
            // If the document array is empty, query for more documents.
            tryQueryAndDelete();
        }
    }
}
18
Andrew Liu

Voici une solution pour supprimer des documents à l'aide du SDK C #. Le code ci-dessous suppose une seule base de données et une seule collection. Il itérera tous les documents de la collection et les supprimera un par un. Pour supprimer des bases de données, des collections ou des documents particuliers, modifiez la méthode "CreateQuery" appropriée pour inclure la syntaxe de sélection SQL. Par exemple, pour sélectionner une base de données particulière,

db = client.CreateDatabaseQuery().Where(o => o.Id == "MyDocDb").ToList().First();

Exemple de code pour supprimer tous les documents dans une instance DocumentDB avec une seule base de données et une seule collection:

using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Util
{
    class Program
    {
        private Uri _docDbUri = new Uri("https://<nameofyourdocdb>.documents.Azure.com:443/");
        private string _docDbKey = "<your primary key>";

        private async Task DeleteDocsAsync()
        {
            using (var client = new DocumentClient(_docDbUri, _docDbKey))
            {
                try
                {
                    var db = client.CreateDatabaseQuery().ToList().First();
                    var coll = client.CreateDocumentCollectionQuery(db.CollectionsLink).ToList().First();
                    var docs = client.CreateDocumentQuery(coll.DocumentsLink);
                    foreach (var doc in docs)
                    {
                        await client.DeleteDocumentAsync(doc.SelfLink);
                    }
                }
                catch (Exception ex)
                {
                    Trace.WriteLine(ex);
                    throw;
                }
            }
        }



        static void Main(string[] args)
        {
            try
            {
                Program p = new Program();
                p.DeleteDocsAsync().Wait();
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}
3
Brett