如何更新cosmos db中的子文档

时间:2018-05-09 02:09:52

标签: c# azure azure-cosmosdb

我是Cosmos Db的新手,想了解如何在文档集中删除/ upsert子文档。

如果我有一份文件:

{ "Id": "1234", "Name": "foo", "Items": [ { "Id": "abcd", "Age": 35, "Claims": [ { "Name": "email", "Value": "foo@bar.com" } ] } ] }

我如何:

1)将一个项目添加到文档中的项目列表中。

2)从项目列表中删除现有项目

3)将项目上传到文档中的项目列表

4)向项目列表中的现有项目添加/删除索赔值?

提前致谢。

2 个答案:

答案 0 :(得分:3)

目前没有办法检索修改和更新文档。

但是,User voice feature request已于2018年3月5日更新:

答案 1 :(得分:3)

正如@Sajeetharan所说,azure cosmos db现在不支持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 Cosmos DB支持MongoDB protocol。您可以在Azure official page确认支持的功能。

因此,支持incremental operations。请参阅此link

希望它对你有所帮助。任何关注,请随时告诉我。