firebase - 如何在颤振中使用计数器?
问题描述
我尝试在我的应用程序中使用计数器来保存喜欢。这是我目前的代码
likevideo(String id, double _rating, String uidofuploadeduser) async {
String uid = FirebaseAuth.instance.currentUser.uid;
DocumentSnapshot doc =
await FirebaseFirestore.instance.collection('videos').doc(id).get();
if (!doc.data()['likes'].contains(uid)) {
FirebaseFirestore.instance.collection('videos').doc(id).update({
'likes': FieldValue.arrayUnion([uid]),
});
FirebaseFirestore.instance
.collection('videos')
.doc(id)
.collection("uservotes")
.doc(uid)
.set({
'rating': _rating,
});
}
}
所以你可以看到我首先检查用户是否不存在于数组中,在这种情况下我让他喜欢,如果他已经存在于数组中,我让他不喜欢。这就是我的方法
dislike(String id, double _rating) async {
String uid = FirebaseAuth.instance.currentUser.uid;
DocumentSnapshot doc =
await FirebaseFirestore.instance.collection('videos').doc(id).get();
if (doc.data()['likes'].contains(uid)) {
FirebaseFirestore.instance.collection('videos').doc(id).update({
'likes': FieldValue.arrayRemove([uid]),
});
FirebaseFirestore.instance
.collection('videos')
.doc(id)
.collection("uservotes")
.doc(uid)
.delete();
}
所以问题是我经常需要数组的长度,因此我想使用计数器函数而不是总是阅读每个文档,但实际上不知道如何做到这一点。所以希望任何人都可以提供帮助。如果您需要更多信息,请发表评论。
举个例子,我用它
Icon(
Icons.star,
size: 37,
color: FirebaseFirestore
.instance
.collection(
"videos")
.doc(videos
.data()['id'])
.collection(
"uservotes")
.doc(uid)!=
null
? Colors.yellow
: Colors.white,
),
Ant 目前列表为空,因此没有用户投票,但星号为黄色
解决方案
我建议使用云功能来做到这一点。否则,您将让每个人都有权更改喜欢的总数;) 只需在有人添加或删除喜欢时设置一个 firestore 触发器。我还建议将每个点赞存储为一个集合文档而不是一个数组,因为正如您所提到的,您需要整个数组(所有点赞)来检查是否有人喜欢某样东西。如果您将其存储在likes/${userUid}
您的下方,只需检查该路径是否存在。它会大大减少你的阅读量。
使用 firestore,您可以通过increment
FieldValue 调用轻松完成:
const increment = admin.firestore.FieldValue.increment(1);
await db
.doc(`user_posts/${postAuthorUid}/posts/${postUid}`)
.set({ comments: increment }, { merge: true });
如果不喜欢,只需更改1
为-1
.
这是文件夹中的整个index.js
文件的functions
样子:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
exports.onLikeCreated = functions.firestore
.document(`videos/{videoUid}/uservotes/{voteUid}`)
.onCreate((snap, context) => {
const db = admin.firestore();
const { videoUid } = context.params;
const { rating = 0 } = snap.data();
const incrementLikes = admin.firestore.FieldValue.increment(1);
const incrementRating = admin.firestore.FieldValue.increment(rating);
return db
.doc(`videos/${videoUid}`)
.set({ likes: incrementLikes, rating: incrementRating }, { merge: true });
});
exports.onLikeDeleted = functions.firestore
.document(`videos/{videoUid}/uservotes/{voteUid}`)
.onDelete((snap, context) => {
const db = admin.firestore();
const { videoUid } = context.params;
const { rating = 0 } = snap.data();
const incrementLikes = admin.firestore.FieldValue.increment(-1);
const incrementRating = admin.firestore.FieldValue.increment(rating * -1);
return db
.doc(`videos/${videoUid}`)
.set({ likes: incrementLikes, rating: incrementRating }, { merge: true });
});
likes
当有人为视频提供邀请时,它会增加价值。likes
字段不需要是数组。您将直接获得计数的数量。
推荐阅读
- angularjs - 验证 Angular 1.x 输入复选框
- python - 比较 pandas DataFrame 和字典之间的数据
- python - Pandas:通过附加列按组获取最大值
- python - HTML 类在使用检查元素时可见,但在 Python 中用 BS4 找不到
- coffeescript - 在 Coffeescript 中访问静态属性
- json - 为什么我的 Go 服务器无法正确解码从客户端发送的 JSON?
- c# - Windows 服务启动和停止 C#
- sql - SQL中where子句中的if语句
- javascript - 刷新浏览器会覆盖 Firebase 中孩子的内容
- php - php7 alpine 不加载库。我怀疑版本不正确