Firestore субколлекций '! =' Запрос - PullRequest
1 голос
/ 26 сентября 2019

Я знаю, что Firestore не поддерживает запросы '! =', Но мне было интересно, сталкивался ли кто-нибудь с подобной ситуацией, как показано ниже:

Вот моя структура БД:

Posts -> postId -> postDocument -> likedBy -> uid

То, что я хочу сделать, - это показывать только те сообщения, в которых нет идентификатора текущего пользователя во вложенной коллекции «iledBy ».Само по себе это невозможно, но я изо всех сил пытаюсь найти даже приличную работу вокруг.

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

1 Ответ

1 голос
/ 26 сентября 2019

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

Способ, которым я это делаюя ищу новые сообщения с помощью облачной функции onCreate, а затем ищу, кто должен видеть это сообщение и т. д., и добавляю его в каждый из своих каналов.

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

Пример функции (отредактированной для краткости), которую я использую для добавления сообщений в ленты подписчиков пользователя.Захватив с помощью запроса collectionGroup, я могу запросить список всех пользователей, которые следуют за автором сообщения.

Схема выглядит следующим образом:

Users (collection)
--- User1 (document)
------- Following (collection of people User1 is following)
----------- FollowingUser1 (document, contains a uid of "followed" user)
----------- FollowingUser2

и Облачная функция:

exports.newReview =  functions.firestore
  .document('reviews/{reviewId}')
  .onCreate((snap, context) => {
      var reviewId = context.params.reviewId
      var reviewData = snap.data()
      var userFollowers = db.collectionGroup('following').where('uid', '==', userId)
      var followingTransaction = db.runTransaction(transaction => {
        return transaction.get(userFollowers).then(restDocs => {
          reviewData['added_via'] = 'following'
          restDocs.forEach(doc => {
            var followerId = doc.ref.parent.parent.id
            var followerRef = db.collection(`feeds/${followerId}/posts`).doc(reviewId)
            transaction.set(followerRef, reviewData);
          })
            return true
        }); 
      });

     return followingTransaction.then(values => {
          console.log(reviewData)
            var shouldPostToTwitter = reviewData.postToTwitter
            return Promise.resolve()
          }) .catch(error => {
            console.log(error)
            return Promise.reject(new Error("Error deleting"));
          });
  });
1014 * DB выглядеть выглядеть следующим образом: 1016 *
...