Эффективное хранение и получение лайков в FireStore / Document DB - PullRequest
0 голосов
/ 02 мая 2018

У меня есть страница с сообщениями и лайками для каждого сообщения.

В FireStore - коллекция постов и коллекция лайков, а я обновляю массив total_likes и недавних лайков, когда пользователю нравится или не нравится пост с помощью облачных функций.

Тем не менее, я не могу понять, как показывать для каждого сообщения, понравилось ли это вошедшему в систему пользователю или нет. Какой эффективный способ сделать это.

Есть указатели?

Ответы [ 2 ]

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

Полагаю, вам, возможно, придется взглянуть на агрегирование данных Хотя этот пример с Angular, я также использую тот же принцип в другом приложении: https://angularfirebase.com/lessons/firestore-cloud-functions-data-aggregation/

Кроме того, вы можете хранить post_id, которые ваш пользователь любит, в своем собственном 'like_array'. Зная, какие сообщения пользователь видит в данный момент, вы можете перекрестно ссылаться на показанные post_id'ы с (like_array) 'like_array' от пользователя, чтобы определить, понравился ли ему тот или иной конкретный пост. В долгосрочной перспективе вы можете устранить неоднозначность like_arrays по дням или неделям и запрашивать только like_arrays этого и последнего дня / недели - в зависимости от того, какую публикацию вы показываете. Если вы работаете с категориями сообщений, применяется аналогичное: разные like_arrays для разных категорий.

Надеюсь, это поможет!

0 голосов
/ 02 мая 2018

Одним из решений было бы иметь другую коллекцию в базе данных Firestore, в которой вы создаете документ пользователем, в котором вы сохраняете (и обновляете) объект , содержащий все публикации, которые понравились этому пользователю.

Как

- likers    (Collection)
   - UserUID (doc)
      -  postIds {
             post1_UID: true,
             post2_UID: true 
         }

Идея состоит в том, чтобы использовать технику, описанную в документе, здесь: https://firebase.google.com/docs/firestore/solutions/arrays#solution_a_map_of_values

Я не знаю, какой язык вы используете в интерфейсе, но в JavaScript вы бы сделали:

var postToTestId = ....;  <- You set this value as you need (e.g. as a function parameter)
firebase.auth().signInWithEmailAndPassword("...", ".....")
    .then(function (info) {
        var postId = 'azer';
        return db.collection('likers')
            .where('postIds.'+ postToTestId, '==', true)
            .get();
    })
    .then(function(querySnapshot) {
        if (querySnapshot.size > 0) {
            console.log("USER LIKES THIS POST!!!");
        }
    })
    .catch(function (error) {
        console.log(error);
    });

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...