NoSQL «как» модель структуры - PullRequest
0 голосов

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

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

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

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

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

пример:

{
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

}
0 голосов
/ 21 мая 2018

Допустим, у вас есть пользовательский документ в вашей коллекции 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
   ...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...