Firebase: объединение столов

Предположим, что данные выглядят так

post: {
  authorId: '123AA',
  title: 'first Post',
  body: 'yay'
}

author: {
  uid: '123AA',
  displayName: 'Richard'
  email: '[email protected]'
}

Я хочу сделать пост с именем автора:

<div className="post">
  <div className="title">{post.title}</div>
  <div className="body">{post.body}</div>
  <div className="author-name">{post.author.displayName}</div> //problem
</div>

Выбранная запись содержит только автораuid, но мне нужен авторскийdisplayName, Как заполнить поле автора при получении сообщений? Вот что я делаю, чтобы получить сообщения прямо сейчас:

const postsRef = firebase.database().ref('posts/')
postsRef.on('value', (snapshot) => {
  this.setState({posts: snapshot.val()})
})
 Rafael Teles05 авг. 2016 г., 14:57
Насколько я знаю, вы не можете делать "соединения" с помощью Firebase, вам нужно сделать второй запрос, чтобы получить что-то из другой коллекции
 Maximus S06 авг. 2016 г., 21:16
@FrankvanPuffelen дополнительный вопрос:stackoverflow.com/questions/38807888/redux-firebase-data-sync
 Frank van Puffelen05 авг. 2016 г., 16:25
@MaximusS объединение действительно требует дополнительного вызова. Эти дополнительные звонки не так дороги, как думает большинство разработчиков, потому чтоFirebase передает запросы по существующему соединению.
 webdeb05 авг. 2016 г., 14:34
Лучше убрать реагировать из тегов, вопрос не имеет ничего общего с Реактом
 Rafael Teles05 авг. 2016 г., 15:05
Проверьте здесь пример "присоединиться" к firebase:firebase.com/docs/web/guide/structuring-data.html#section-join
 Maximus S05 авг. 2016 г., 14:58
так это то, что люди делают? Для каждого добавляемого поста вы делаете еще один запрос на получение объекта пользователя с сервера?

Ответы на вопрос(1)

но я использую join довольно часто в angular2. Вот мой пример кода.

import { Component, OnInit } from '@angular/core';
import { AngularFire } from 'angularfire2';
import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map';

@Component({
  selector: 'app',
  templateUrl: `
    <ul>
        <li *ngFor="let p of posts | async">
            {{ p.title }} - {{ (p.authorName | async)?.displayName }}
        </li>        
    </ul>
`
})
export class InitComponent implements OnInit {
    posts: Observable<any[]>;

  constructor(private af: AngularFire) {}

  ngOnInit() {
      this.posts = this.af.database.list('/posts')
      .map(posts => {
          posts.map(p => {
              p.authorName = this.af.database.object('/authors/'+p.authorId);
          });
          return posts;
      });
  }

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

/posts/postId/{authorId, title, body}
/authors/authorId/{displayName, email}

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

Ваш ответ на вопрос