【问题标题】:NoSQL 'like' model structureNoSQL 'like' 模型结构
【发布时间】:2018-10-29 00:21:18
【问题描述】:

我有一些关系数据库经验,但我对 NoSQL 数据库还是很陌生。我正在尝试执行以下操作(在 Firebase Firestore 中)我有一组用户文档和一组项目文档。
用户必须能够喜欢一个项目。我的关系数据库思维转向将用户文档的 ID 和项目的 ID 保存在表中的结构,但这在 NoSQL 数据库中不起作用。

没有详细介绍我提出的无效解决方案,我想知道这里是否有人有解决方案?我希望能够为特定用户获取所有喜欢的项目,而无需 100 次往返服务器。

编辑@Jesús Fuentes:多个用户应该能够喜欢同一个项目

【问题讨论】:

标签: firebase nosql google-cloud-firestore


【解决方案1】:

假设您的users 集合中有一个用户文档user1user1 看到一个他喜欢的项目,所以他“喜欢”那个项目。在user1 文档中,创建了一个新集合likedItems。在该用户的likedItems 集合中,添加了一个文档,其中包含点赞项目的 ID,例如,0001

现在,如果您想获取特定用户的所有喜欢的项目,您只需从他们的likedItems 集合中获取所有文档。

任何语言的概念都是相同的,但这里有一个 JavaScript 示例:

db.collection(`users/${userId}/likedItems`).get().then(snapshot => {
  snapshot.forEach(doc => {
    // doc is the document for a liked item
   ...
  }
}

【讨论】:

  • 谢谢!肯定会使用这种方法(没有足够的声誉来投票......)
【解决方案2】:

最终感谢@Geoff和@Egghead的帮助,我设法做到了:
每个项目都有一个带有 key:bool 对的 Likedby 数组,其中 key 是用户 ID,如果用户喜欢该项目,则 bool 设置为 true(不需要添加所有其他用户为 false)。根据The Firebase Docs,这是必需的,因为无法查询仅包含用户ID 字符串的数组。

示例:

{
item: "Stackoverflow",
likedBy: {
    "Egghead": true,
    "Geoff": true,
    "f5172c0d83892c41b60de3f1fadd89": true
}

然后可以使用(Swift,请参阅其他语言的文档)进行查询:

db.collection("posts")
             .whereField("likedBy.Egghead", isEqualTo: true)
                         .getDocuments() { (querySnapshot, err) in

    // do what you have to do

}

【讨论】:

  • 当您同时列出喜欢和不喜欢的产品时,此解决方案也很好。因此,如果当前用户喜欢项目,您可以检查并显示“壁炉”。
猜你喜欢
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多