Upsert 只更改/新字段?

twe*_*ypi 0 azure azure-cosmosdb

对于存储在 azure cosmos 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;
Run Code Online (Sandbox Code Playgroud)

这似乎也删除了 commentHistory。

如果文档不存在,是否可以进行 upsert 并仅在 id 上插入?

Mat*_*nta 5

Cosmos DB 不允许部分更新,因此在您的情况下,您需要:

  1. 阅读当前文档。
  2. 如果没有,则创建一个新对象。
  3. 添加新的历史项目。
  4. 调用 Upsert。

不过好像有设计问题。您的commentHistory属性似乎是无限的(可能无休止地增长),这将使后续操作更加昂贵,就 RU 而言(因为文档不断增长),并且在某些时候可能会达到当前的文档大小限制 (2Mb) .

另一种选择是为每个评论历史事件保留一个文档,并添加一个属性作为userId.

在这种情况下,如果出现新的评论历史事件,您将始终只执行 aCreateDocumentAsync并且不会有任何无限制的问题。如果您想获取特定用户的所有评论历史,您可以查询特定userId.