对于存储在蔚蓝宇宙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上插入?
答案 0 :(得分:3)
Cosmos DB不允许部分更新,因此对于您而言,您需要:
虽然似乎存在设计问题。您的commentHistory
属性似乎是不受限制的(可能会不断增长),这会导致后续操作的费用(以RU计)更加昂贵(因为文档不断增长),并且在某些时候可能会影响当前文档大小上限(2Mb)。
另一种替代方法是,每个注释历史记录事件保留一个文档,并添加一个属性为userId
。
在这种情况下,如果发生新的评论历史记录事件,则您始终只需执行CreateDocumentAsync
,就不会遇到任何问题。
如果要获取特定用户的所有评论历史记录,则可以查询特定userId
的评论历史记录文档。
答案 1 :(得分:1)
Upsert
的行为是创建一个新文档(如果尚不存在),或者覆盖现有文档,没有部分更新。
如果您打算的工作流程是创建一个不存在的用户(否则不进行更新),我建议尝试创建它并处理DocumentClientException
中的冲突状态代码(如果已有的话)。 / p>
您发布的代码是被新用户还是现有用户更频繁地调用?根据您可能要面对的用户ID冲突次数,您可能还决定采用一种悲观的方法,尝试读取文档(给定ID)并仅在不存在文档时才插入。