将子集合添加为单个ID文档Firestore的一部分

时间:2018-08-22 16:39:10

标签: angular firebase google-cloud-firestore angularfire2

我正在尝试将多个图像的URL(以前加载到Storage中)保存在Firestore文档的子集合中。

到目前为止,我已经实现了它,但是它为每个图像生成了一个文档(带有其各自的子集合img),这不是我想要的:

enter image description here

我想要在子集合img中生成的每个文档: enter image description here

我知道每个图像都会对函数guardarImagen()进行迭代,但是我不了解如何将其分离,因此它在第一层生成一个文档(第二层是子集合,在那里(如果可以迭代,也可以)。我不知道是否让自己被理解。

import { Injectable } from '@angular/core';

import { AngularFirestore } from 'angularfire2/firestore';
import * as firebase from 'firebase/app';
import { FileItem } from '../class/file-item';

@Injectable({
  providedIn: 'root'
})
export class CargaImagenesService {

  private myFolder = 'img';

  constructor(private db: AngularFirestore) { }

  cargarImagenesFirebase(imagenes: FileItem[]) {

    const myTest = this.db.collection('test').ref.doc();
    console.log(myTest.id)


    const storageRef = firebase.storage().ref();

    for (const item of imagenes) {
      item.estaSubiendo = true;
      if (item.progreso >= 100) {
        continue;
      }

      const uploadTask: firebase.storage.UploadTask =
        storageRef.child(`${this.myFolder}/${item.nombreArchivo}`)
          .put(item.archivo);

      uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED,
        (snapshot: firebase.storage.UploadTaskSnapshot) =>
          item.progreso = (snapshot.bytesTransferred / snapshot.totalBytes) * 100,
        (error) => console.error('Error al subir', error),
        () => {
          console.log('Imagen cargada correctamente');
          uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => {
            item.url = downloadURL;
            item.estaSubiendo = false;
            this.guardarImagen({
              nombre: item.nombreArchivo,
              url: item.url
            });
          });
        });
    }

  }

  
  guardarImagen( imagen: { nombre: string, url: string } ) {
    this.db.collection('test2').ref.doc().collection(`/${this.myFolder}`).add(imagen);
     
  }


}

2 个答案:

答案 0 :(得分:2)

问题很可能来自guardarImagen()函数中的一行:

 this.db.collection('test2').ref.doc().collection(`/${this.myFolder}`).add(imagen);

以及您做doc()的事实:

here所述,doc()方法“在指定路径下获取集合中文档的DocumentReference。如果未指定路径,将自动生成唯一ID。 用于返回的DocumentReference。”

您应该执行以下操作:

this.db.collection('test2').ref.doc('myDoc1').collection(`/${this.myFolder}`).add(imagen);

指定要向其填充子集合的文档,而不是每次调用该函数时都要创建一个新文档(使用通过不带任何路径调用doc()生成的自动生成的唯一ID)

// 根据Tim Martens的回答和评论进行编辑 ,并提到“添加.ref会将其转换为本地firebase.firestore.CollectionReference

答案 1 :(得分:1)

雷诺(Renaud)的回答中的评论: const docRef = this.db.collection('test3').doc();:在这里,.ref像这样丢失:
 const docRef = this.db.collection('test3').ref.doc();

您需要将此documentReference传递给guardarImagen()函数:

cargarImagenesFirebase() {

    const imagenes = [
        { nombre: 1, url: 'https://url1/1.png' },
        { nombre: 2, url: 'https://url2/2.png' },
        { nombre: 3, url: 'https://url3/3.png' }
    ];

    const testDocRef = this.db.collection('test').ref.doc();

    for (const item of imagenes) {
        this.guardarImagen(testDocRef, item);
    }
}

guardarImagen(testDocRef: DocumentReference, item: { nombre: number; url: string; }): any {
    testDocRef.collection(this.myFolder).add(item);
}

为简单起见,我省略了上传/存储部分。