【发布时间】:2018-02-27 14:14:20
【问题描述】:
我在思考如何最好地构建我的(非常简单的)Firestore 应用程序时遇到了一些麻烦。我有一组这样的用户:
users: {
'A123': {
'name':'Adam'
},
'B234': {
'name':'Bella'
},
'C345': {
'name':'Charlie'
}
}
...每个用户都可以“喜欢”或“不喜欢”任意数量的其他用户(例如 Tinder)。
我想构建一个“喜欢”表(或 Firestore 等效表),以便列出我尚未喜欢或不喜欢的人。我最初的想法是在用户表中创建一个“喜欢”对象,其布尔值如下:
users: {
'A123': {
'name':'Adam',
'likedBy': {
'B234':true,
},
'disLikedBy': {
'C345':true
}
},
'B234': {
'name':'Bella'
},
'C345': {
'name':'Charlie'
}
}
这样,如果我是 Charlie 并且我知道我的 ID,我可以列出我还没有喜欢或不喜欢的用户:
var usersRef = firebase.firestore().collection('users')
.where('likedBy.C345','==',false)
.where('dislikedBy.C345','==',false)
这不起作用(每个人都被列出)所以我怀疑我的方法是错误的,尤其是 '==false' 部分。有人可以为我指出如何构建它的正确方向吗?作为一个额外的额外问题,如果有人更改了他们的名字会发生什么?我是否需要更改所有嵌入的“likedBy”数据?或者我可以使用云功能来实现这一点吗?
谢谢!
【问题讨论】:
-
这个
.where('likedBy.C345','==',false)将返回likedBy.C345的值为false的用户。它不会返回对likedBy.C345没有任何价值的用户。我认为没有办法查询后者。另见this answer。嗯....毕竟我找到了解决方案:twitter.com/abeisgreat/status/929808518428762112。如果可行,我会尝试并写下答案。 -
谢谢弗兰克。看起来“orderBy”技巧能够过滤掉不为空的记录,但我猜想相反。查找尚未为该 ID 设置“likedBy”字段的记录。我可能一开始就错误地构建了数据库吗?我猜这是一个非常典型的应用案例。
-
是的,我刚刚发现了同样的情况:它只返回具有该字段的文档。我已经在想我们到底是如何获得这种性能的。 :-) 这意味着我知道如何实现这个用例的唯一方法是像我给出的第一个链接一样预先填充字段,这可能包括扇出添加到系统中的任何新用户的 UID。相当繁重的工作,所以我肯定会考虑这是否真的是一个值得努力的常见用例。
-
也许我理解错了,但肯定有很多用例,其中一个用户喜欢另一个用户,而您想列出不喜欢的用户。是否有类似的关系可以帮助我正确地构建它?干杯
-
我能想到的唯一方法是为每个未投票的用户预先填充
false。
标签: node.js firebase google-cloud-firestore