web-dev-qa-db-ja.com

cosmosdbのサブドキュメントをどのように更新しますか

Cosmos Dbを初めて使用し、ドキュメントコレクション内のサブドキュメントを削除/アップサートする方法を理解したいと思います。

私が文書を持っている場合:

{ "Id": "1234", "Name": "foo", "Items": [ { "Id": "abcd", "Age": 35, "Claims": [ { "Name": "email", "Value": "[email protected]" } ] } ] }

どうすればよいですか:

1)ドキュメントのアイテムリストにアイテムを追加します。

2)アイテムリストから既存のアイテムを削除します

3)ドキュメントのアイテムリストにアイテムをアップサートします

4)アイテムリストの既存のアイテムにクレーム値を追加/削除しますか?

前もって感謝します。

6
Jerrod Horton

@Sajeetharanが言ったように、Azure cosmosdbは現在partial updatesをサポートしていません。チームはこの機能に積極的に取り組んでいるようです。これで、stored procedureでドキュメント全体を更新できます。

参考のために以下のサンプルコード:

function updateSproc(id, update) {
    var collection = getContext().getCollection();
    var collectionLink = collection.getSelfLink();
    var response = getContext().getResponse();

    tryQueryAndUpdate();

    function tryQueryAndUpdate(continuation) {
        var query = {query: "select * from root r where r.id = @id", parameters: [{name: "@id", value: id}]};
        var requestOptions = {continuation: continuation};

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

            if (documents.length > 0) {
                tryUpdate(documents[0]);
            } else {
                throw new Error("Document not found.");
            }
        });
    }

function tryUpdate(document) {
    var requestOptions = {etag: document._etag};

    var fields, i;

    fields = Object.keys(update);
    for (i = 0; i < fields.length; i++) {
       document[fields[i]] = update[fields[i]];
    }

    var isAccepted = collection.replaceDocument(document._self, document, requestOptions, function (err, updatedDocument, responseOptions) {
        if (err) throw err;
        response.setBody(updatedDocument);
    });
}

ただし、Azure CosmosDBはMongoDB protocolをサポートしています。サポートされている機能は Azure公式ページ で確認できます。

したがって、incremental operationsがサポートされます。これを参照してください リンク

お役に立てば幸いです。ご不明な点がございましたら、お気軽にお問い合わせください。

3
Jay Gong

現在、変更を行ってドキュメントを取得して更新する以外に方法はありません。

ただし、 User voice feature request 2018年3月5日に更新されました:

3
Sajeetharan