我正在使用React和Firestore创建类似于网站的博客。每个帖子都作为Post集合中的单独文档存储。
文档结构如下:
--Posts
--Post1
--title
--body
--views
--likes
--Post2
--title
--body
--views
--likes
我想在有人查看帖子时更新视图。在Firestore中实现这一目标的最佳方法是什么。
答案 0 :(得分:3)
在许多情况下,您可以直接使用update。但是,由于您正在递增计数器,因此当多个用户尝试在同一时间递增计数器时,您还应使用transaction来防止竞争条件:
// Create a reference to the post.
const postRef = db.collection('Posts').doc('<postId>');
return db.runTransaction(function(transaction) {
// This code may get re-run multiple times if there are conflicts.
return transaction.get(postRef).then(function(post) {
if (!post.exists) {
throw new Error('Post does not exist!');
}
const newViews = post.data().views + 1;
transaction.update(postRef, { views: newViews });
});
}).then(function() {
console.log('Transaction successfully committed!');
}).catch(function(error) {
console.log('Transaction failed: ', error);
});