web-dev-qa-db-ja.com

DocumentDB内のすべてのドキュメントをC#コードで削除する方法

DocumentDBというMicrosoftの新しいデータベースを使用しています。 IDでドキュメントを削除したいのですが、どうすればよいかわかりません。 DocumentDBでの削除操作にはセルフリンクが必要であり、自分のIDとは異なります。ただし、ドキュメントを1回照会すると、セルフリンクが表示されます。そのセルフリンクで、ドキュメントを削除しています。

次に、コレクション内の50000以上のドキュメントを含むすべてのドキュメントを削除します。

各ドキュメントを取得してから削除するか、同じことを行う簡単な方法が必要ですか?

それは可能ですか?

16
satish kumar V

ドキュメントを削除するには、ドキュメントの_selfリンクへの参照が必要であることは間違いありません。

コレクション内のドキュメント[〜#〜] all [〜#〜]を削除する場合-削除して再実行する方が簡単で高速な場合があります-コレクションを作成します。唯一の注意点は、サーバー側のスクリプト(sprocs、udfs、トリガーなど)もコレクションに属しており、再作成する必要がある場合があることです。

pdate:クエリを指定して一括削除を実行する簡単なストアドプロシージャを記述しました。これにより、より少ないネットワーク要求で一括削除操作を実行できます。

/**
 * 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

これは、C#SDKを使用してドキュメントを削除するためのソリューションです。以下のコードは、単一のデータベースと単一のコレクションを想定しています。コレクション内のすべてのドキュメントを反復処理し、一度に1つずつ削除します。特定のデータベース、コレクション、またはドキュメントを削除するには、適切な "CreateQuery"メソッドを変更して、SQL選択構文を含めます。たとえば、特定のデータベースを選択するには、

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

単一のデータベースと単一のコレクションを持つDocumentDBインスタンス内のすべてのドキュメントを削除するためのサンプルコード:

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