仅更新/更改字段?

时间:2018-07-19 22:30:22

标签: azure azure-cosmosdb

对于存储在蔚蓝宇宙db中的用户,我具有以下结构:

{ id:string, commentHistory:[] }

当请求用户时,我做了一个upsert,传递了用户ID,这就是我所拥有的:

string requestBody = new StreamReader(req.Body).ReadToEnd();
            var toUpsert = JsonConvert.DeserializeObject<dynamic>(requestBody);

            var cosmos = Config.Cosmos.Get;
            var media = await cosmos.GetCollection("users");

            ResourceResponse<Document> result = await cosmos.UpsertDocument(Config.Cosmos.Keys.Collections.MediaCollection, toUpsert);
            return result.Resource;

这似乎也要删除commentHistory。

是否可以进行upsert,并且仅在文档不存在的情况下才在id上插入?

2 个答案:

答案 0 :(得分:3)

Cosmos DB不允许部分更新,因此对于您而言,您需要:

  1. 阅读当前文档。
  2. 如果没有,请创建一个新对象。
  3. 添加新的历史记录项。
  4. 致电Upsert。

虽然似乎存在设计问题。您的commentHistory属性似乎是不受限制的(可能会不断增长),这会导致后续操作的费用(以RU计)更加昂贵(因为文档不断增长),并且在某些时候可能会影响当前文档大小上限(2Mb)。

另一种替代方法是,每个注释历史记录事件保留一个文档,并添加一个属性为userId

在这种情况下,如果发生新的评论历史记录事件,则您始终只需执行CreateDocumentAsync,就不会遇到任何问题。 如果要获取特定用户的所有评论历史记录,则可以查询特定userId的评论历史记录文档。

答案 1 :(得分:1)

Upsert的行为是创建一个新文档(如果尚不存在),或者覆盖现有文档,没有部分更新。

如果您打算的工作流程是创建一个不存在的用户(否则不进行更新),我建议尝试创建它并处理DocumentClientException中的冲突状态代码(如果已有的话)。 / p>

您发布的代码是被新用户还是现有用户更频繁地调用?根据您可能要面对的用户ID冲突次数,您可能还决定采用一种悲观的方法,尝试读取文档(给定ID)并仅在不存在文档时才插入。