Flutter Firestore实现仅查看已关注用户帖子的方案咨询
实现用户仅查看已关注用户帖子的方案
根据你的集合结构,下面分两种主流数据库场景给出具体实现方式:
一、MongoDB(文档型数据库)实现
分步查询方式
- 先获取当前用户的关注列表:
从user集合中查询当前用户的文档,提取出follower数组(即该用户关注的所有用户UID):const currentUser = db.user.findOne({ uid: "当前用户的UID" }, { follower: 1, _id: 0 }); const followedUids = currentUser.follower; - 查询关注用户的帖子:
用$in操作符匹配post集合中发帖用户UID在关注列表内的文档:db.post.find({ uid: { $in: followedUids } });
聚合查询一步到位
如果想减少数据库请求次数,可以用聚合管道关联两个集合直接查询:
db.post.aggregate([ // 关联user集合,匹配发帖用户的信息 { $lookup: { from: "user", localField: "uid", foreignField: "uid", as: "post_author" } }, // 筛选出当前用户关注的作者的帖子 { $match: { "post_author.uid": { $in: ["当前用户的UID对应的关注列表"] } } }, // 只返回需要的帖子字段 { $project: { _id: 1, uid: 1, // 这里添加你需要展示的其他帖子字段,比如内容、发布时间等 } } ])
二、关系型数据库(以MySQL为例)实现
注意:关系型数据库通常不推荐用数组存储follower,更规范的做法是用中间表维护关注关系。
规范中间表方案
- 先创建关注关系中间表
user_follow:
CREATE TABLE user_follow ( uid INT NOT NULL COMMENT '关注者ID', followed_uid INT NOT NULL COMMENT '被关注者ID', PRIMARY KEY (uid, followed_uid), FOREIGN KEY (uid) REFERENCES user(uid), FOREIGN KEY (followed_uid) REFERENCES user(uid) );
- 查询当前用户关注的帖子:
通过关联post表和user_follow表,筛选出符合条件的帖子:
SELECT p.* FROM post p INNER JOIN user_follow uf ON p.uid = uf.followed_uid WHERE uf.uid = 123; -- 123替换为当前用户的UID
直接存储数组的兼容方案(不推荐)
如果你的user表确实用JSON类型存储follower数组,可以用JSON函数查询:
SELECT p.* FROM post p INNER JOIN user u ON JSON_CONTAINS(u.follower, CAST(p.uid AS JSON)) WHERE u.uid = 123; -- 123替换为当前用户的UID
性能优化建议
- MongoDB:给
post.uid和user.uid字段创建单字段索引,提升查询速度; - MySQL:给
user_follow(uid, followed_uid)创建联合索引,给post.uid创建单字段索引。
内容的提问来源于stack exchange,提问作者fatih yılmaz
相关产品推荐
相关产品推荐

