如何在Firestore中加入多个文档?

拉斐尔·莫拉(Rafael Moura)

我有一个具有以下结构的Firestore数据库:

  • 使用者

    • [uid]
      • 名称:“用户一个”
  • 艺术家

    • [uid]
      • 风格:'流行睾丸'
      • user_uid:[uid]

为我服务

constructor(private afu: AngularFireAuth, private afs: AngularFirestore, private storage: AngularFireStorage) { 
   this.usersCollection = afs.collection<User>('users');
   this.users = this.usersCollection.valueChanges();
}

getUsers() {
   return this.users = this.usersCollection.snapshotChanges()
     .pipe(map(changes => {
       return changes.map(action => {
         const data = action.payload.doc.data() as User;
         return data
       });
     }));
 }

用户和艺术家之间如何加入?

本·布拉德肖

使用combineLatest是一个很好的方法。由于用户上不存在user_uid,因此我将idField作为user_uid添加到了用户。首先查看代码,然后阅读以下内容以获取解释。

    import { Component, OnInit } from '@angular/core';
    import { AngularFirestore } from '@angular/fire/firestore';
    import { Observable, combineLatest } from 'rxjs';
    interface User {
      name: string;
      user_uid: string;
    }
    interface Artist {
      style: string;
      user_uid: string;
    }
    interface Joined {
      user_uid: string;
      name: string;
      style: string;
    }
    @Component({
      selector: 'test',
      templateUrl: './test.component.html',
      styleUrls: ['./test.component.scss']
    })
    export class TestComponent implements OnInit {
    
      users$: Observable<User[]>;
      artists$: Observable<Artist[]>;
      joined$: Observable<Joined[]>;
      
      constructor(private afs: AngularFirestore){}
    
      ngOnInit(){
        this.users$ = this.afs.collection<User>('users').valueChanges({idField: 'user_uid'});
        this.artists$ = this.afs.collection<Artist>('artists').valueChanges();
        this.joined$ = combineLatest(this.users$, this.artists$, (users, artists) => {
            const joinedAsMap: Map<string, Joined> = new Map(artists.map(oneArtist =>  [oneArtist.user_uid, { ...{name: null} , ...oneArtist}]));
            users.forEach(one => joinedAsMap.set(one.user_uid , {...{name: one.name}, ...joinedAsMap.get(one.user_uid) } ));
            const joined: Joined[] = Array.from(joinedAsMap.values());
            return joined;
        });
      }
    }
  1. 建立连接界面
  2. 获得两个可观测值
  3. 使用结合最新
  4. 使用uid作为键,使用artist作为值来构建地图。只需将名称设置为null即可使用这些类型。使用传播运算符合并一些对象。
  5. 遍历用户并将用户信息添加到每个键的值中
  6. 根据地图值构建连接数组
  7. 返回值

您可以使用不同的方法来执行此操作,但是使用es6映射是简化某些事情的好方法。另外,没有机会测试真实的数据库,因此您可能需要进行验证。而且,这些都在用于演示的组件中。您可以肯定在服务中执行此操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在MongoDB中加入和合并多个集合

来自分类Dev

如何在MongoDB 3.4中加入多个集合?

来自分类Dev

如何在VBA中加入收藏

来自分类Dev

如何在QT中加入网址

来自分类Dev

如何在Linux内核中加入线程?

来自分类Dev

如何在管道中加入数组

来自分类Dev

如何在Django中加入惰性翻译?

来自分类Dev

如何在python中加入map的值

来自分类Dev

如何在R中加入左联接

来自分类Dev

如何在熊猫中加入日期范围?

来自分类Dev

如何在Armadillo中加入矩阵

来自分类Dev

如何在python中加入整数间隔?

来自分类Dev

如何在C ++中加入strcpy

来自分类Dev

如何在datagridview中加入行?

来自分类Dev

如何在PHP中加入数组值?

来自分类Dev

如何在Pandas中加入json

来自分类Dev

如何在MySQL中加入计数?

来自分类Dev

如何在PHP中加入数组?

来自分类Dev

如何在MySql中加入2列?

来自分类Dev

如何在Shell脚本中加入路径

来自分类Dev

如何在createQuery()中加入多对多

来自分类Dev

如何在PostgreSQL中加入select自身?

来自分类Dev

如何在Notepad ++中加入多义线?

来自分类Dev

如何在QT中加入网址

来自分类Dev

如何在R中加入左联接

来自分类Dev

如何在phpmyadmin中加入表格

来自分类Dev

如何在javascript中加入这些值?

来自分类Dev

如何在 Xpath 1.0 中加入?

来自分类Dev

如何在Android中加入(字面上)两个/多个ContentProvider?