Структура модели типа NoSQL

У меня был некоторый опыт работы с реляционными базами данных, но я новичок в базах данных NoSQL. Я пытаюсь сделать следующее (в Firebase Firestore) у меня есть набор пользовательских документов и набор документов элементов. Пользователь должен иметь возможность ставить отметку "Нравится". Мое мышление о реляционной базе данных смещается в сторону структуры, в которой идентификатор пользовательского документа и идентификатор элемента сохраняются в таблице, но это не будет работать в базе данных NoSQL.

Не вдаваясь в подробности неработающего решения, которое я придумал, мне было интересно, есть ли у кого-нибудь здесь решение? Я хочу иметь возможность получать все понравившиеся элементы для конкретного пользователя без сотен обращений к серверу.

Edit @ Jesús Fuentes: нескольким пользователям должен понравиться один и тот же предмет

Разве вы не можете просто добавить поле в документ элемента, где вы храните идентификаторы пользователей, которым нравится этот фактический элемент? Изменить, это должно дать вам хороший ответ: stackoverflow.com/questions/4126811/… и stackoverflow.com/questions/40285295/…

Jesús Fuentes 18.05.2018 16:23
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
1
1
588
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Допустим, у вас есть пользовательский документ в вашей коллекции users, user1. user1 видит предмет, который ему нравится, поэтому он "любит" этот предмет. В документе user1 сделана новая коллекция, likedItems. В коллекцию likedItems этого пользователя добавлен документ с идентификатором понравившегося элемента, например, 0001.

Теперь, если вы хотите получить все понравившиеся элементы для определенного пользователя, вам просто нужно получить все документы из его коллекции likedItems.

Концепция одинакова для любого языка, но вот пример JavaScript:

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

Спасибо! Обязательно воспользуюсь этим методом (у вас недостаточно репутации, чтобы проголосовать за ...)

f5172c0d83892c41b60de3f1fadd89 24.05.2018 07:45

В конце концов, благодаря помощи @ Джефф и @ Умник мне удалось сделать это следующим образом:
У каждого элемента есть массив Likedby с парами key: bool, где ключ - это идентификатор пользователя, а для bool установлено значение true, если пользователю понравился элемент (добавлять всех остальных пользователей с false не обязательно). Согласно Документы Firebase, это необходимо, потому что массив, состоящий только из строк идентификаторов пользователей, не может быть запрошен.

пример:

{
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

}

Другие вопросы по теме