Firestore onSnapshot вложенной коллекции внутри документа - PullRequest
0 голосов
/ 13 октября 2019

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

Я структурировал базу данных noSQL следующим образом:

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

enter image description here

В каждом документе есть коллекция с именем 'разговоры, которые будут содержать все чаты между двумя пользователями.

enter image description here

Если я слушаю документ, который имеет определенный идентификатор в первой коллекции'чаты', я получу журнал в своей консоли, если я изменю поле, например 'timestamp', чтобы эта часть работала.

db.collection('chats').where(firebase.firestore.FieldPath.documentId(), '==', '#randomHASH').onSnapshot((snapshot) => {
    let changes = snapshot.docChanges();
    console.log('CHANGES');
    console.log(changes);

    changes.forEach(change => {
        console.log(change.doc.data());
    })
});

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

Я пытался, но это не похоже на хитрость:)

db.collection('chats').where(firebase.firestore.FieldPath.documentId(), '==', '#randomHASH').collection('conversations').onSnapshot((snapshot) => {
    let changes = snapshot.docChanges();
    console.log('CHANGES');
    console.log(changes);

    changes.forEach(change => {
        console.log(change.doc.data());
    })
});

И вот как я начинаю Firebase

<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/7.1.0/firebase-app.js"></script>

<!-- The core Firebase JS SDK is always required and must be listed first -->
<script src="https://www.gstatic.com/firebasejs/7.1.0/firebase-firestore.js"></script>

<!-- TODO: Add SDKs for Firebase products that you want to use
     https://firebase.google.com/docs/web/setup#available-libraries -->
<script src="https://www.gstatic.com/firebasejs/7.1.0/firebase-analytics.js"></script>

<script>
  // Your web app's Firebase configuration
  var firebaseConfig = {
    apiKey: "xxxxxxxxx",
    authDomain: "myapp-xxxxx.firebaseapp.com",
    databaseURL: "https://myapp.firebaseio.com",
    projectId: "myapp-xxxxx",
    storageBucket: "myapp-xxxxx.appspot.com",
    messagingSenderId: "xxxxxxxxx",
    appId: "1:xxxxx:web:xxxx",
    measurementId: "x-xxxxxx"
  };
  // Initialize Firebase
  firebase.initializeApp(firebaseConfig);
  firebase.analytics();
  const db = firebase.firestore();
</script>

1 Ответ

2 голосов
/ 13 октября 2019

Вы должны просто сделать:

db.collection('chats').doc('#randomHASH').collection('conversations').onSnapshot((snapshot) => {...});

Как объяснено в doc , "A DocumentReference также может использоваться для создания CollectionReference для подколлекции."

На самом деле, вы можете связать методы collection() и doc() столько раз, сколько необходимо, чтобы получить ссылку на любой документ или (под-)(sub -) (...) collection


Обратите внимание, что аналогично в первом случае вы можете сделать:

db.collection('chats').doc('#randomHASH').onSnapshot((snapshot) => {...});

Теперь, почемуВаш код работает в первом случае, а не во втором?

В первом случае, выполнив db.collection('chats').where(firebase.firestore.FieldPath.documentId(), '==', '#randomHASH'), вы определяете query, который имеетonSnapshot() метод.

Но во втором случае вы вызываете метод collection() для того же query, тогда как query не имеет такого метода.

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