NoSQL'喜欢'模型结构

时间:2018-05-18 14:17:56

标签: firebase nosql google-cloud-firestore

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

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

编辑@JesúsFuentes:多个用户应该能够喜欢相同的项目

2 个答案:

答案 0 :(得分:1)

假设您的users集合user1中有用户文档。 user1看到了他喜欢的物品,所以他“喜欢”那件物品。在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
   ...
  }
}

答案 1 :(得分:0)

最后感谢@ Geoff和@ Egghead的帮助,我成功完成了以下操作:
每个Item都有一个Likedby数组,其中包含key:bool对,其中键是userID,如果用户喜欢该项,则bool设置为true(将所有其他用户添加为false isn not t) 。根据{{​​3}},这是必需的,因为不能查询只有用户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

}