gpt4 book ai didi

firebase - Firestore交易-仅在 key 不存在时如何添加。永远不想更新

转载 作者:行者123 更新时间:2023-12-01 21:17:21 25 4
gpt4 key购买 nike

我有一个插入文档的集合。仅当以前没有人添加文档时,才需要插入具有特定键的文档。如果 key 存在并且我需要使用事务进行更新-那很好。但是在这里,我需要确保不存在带有该键的文档,然后将其插入。请不要讨论如何使用Firestore交易更新现有记录-效果很好-但这不是我的问题。我的问题是如何确保和检查文档在集合中不存在,然后才添加它。并确保在我的检查和添加之间-没有人捕获机会并用该 key 添加文档。在那种情况下,我将最终更新某人添加的文档。因为好像Firestore交易不会锁定不存在的文档-还是它们?这个问题有什么解决方案?

// Checking if document exists - if it does updating some field (not important)
ref := clientdb.Collection("mycollection").Doc("12345")
err = clientdb.RunTransaction(context.Background(), func(ctx context.Context, tx *firestore.Transaction) error {
doc, err := tx.Get(ref) // tx.Get, NOT ref.Get!
if err != nil {
return err
}
count1, err := doc.DataAt("querycount")
if err != nil {
return err
}

return tx.Set(ref, map[string]interface{}{
"querycount": count1.(int64) + 1,
}, firestore.MergeAll)
})
/* Important part is here */
/* If someone inserts the document with same key here, I will end up updating it below */
/* I wish to guarantee no one inserts document with that key "12345" */
/* THE TIME HERE is crucial, no one should be able to add the key here (say a different session/thread that preempted my OS thread at this location or if firestore inserted someone else document using different session) */

if err != nil {
// Inserting document here - do not wish to update if someone already inserted after the above check
_, err = clientdb.Collection("mycollection").Doc("12345").Set(context.Background(), map[string]interface{}{
"field1": field1,
"querycount": 0,
})

}
如何确保,我不会更新其他人的文档(或几秒钟前通过单击多个按钮添加的我自己的文档,或者两个人同时单击以添加,而其中一个捕获并添加了它-在检查之间以及第二人称的实际插入/添加命令。)更重要的是,只有在没有人添加时,我才需要添加。不想触摸/更新其他人添加的文档(或者如果我之前添加过文档,则触摸我自己的文档-说单击多个按钮并一次又一次发送请求)。谢谢!

最佳答案

调用DocumentRef.Create创建一个新文档。如果存在具有相同ID的文档,则Create方法将失败。
另请参见Transaction.CreateWriteBatch.Create
使用CollectionRef.NewDoc创建唯一的文档ID。

关于firebase - Firestore交易-仅在 key 不存在时如何添加。永远不想更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63962136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com