【问题标题】:Add sub collection as part of a single ID document Firestore添加子集合作为单个 ID 文档 Firestore 的一部分
【发布时间】:2018-08-22 16:39:10
【问题描述】:

我正在尝试将多个图像的 url(之前加载到存储中)保存在 firestore 文档的子集合中。

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

我想要的是在子集合img 中生成每个文档:

我知道函数 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);
     
  }


}

【问题讨论】:

    标签: angular firebase google-cloud-firestore angularfire2


    【解决方案1】:

    问题很可能来自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

    【讨论】:

    • 我同意,但作为 myDoc1 的替代品,我每次上传图片时都会自动生成 ID 或在任何情况下成为不同的文档?
    • 对不起,我不明白你的评论。请您详细说明一下吗?
    • 我如何使myDoc1 成为myDoc2myDoc3 等等。或者在任何情况下使用不同的 ID?
    • 我认为您应该使用您在顶部创建的 myTest 文档。我了解您获得了一组图像,这些图像要存储在文档下的子集合中。所以首先创建文档(在这种情况下使用doc()),然后遍历图像以填充子集合。
    • 没错!这正是我尝试做的,如果您有任何参考或示例,那就太好了,我支持您的帮助。
    【解决方案2】:

    来自 Renaud 回答中的 cmets:
    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);
    }
    

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

    【讨论】:

    • 感谢您详细说明现有的讨论!我想添加.ref 是应该在angularfire2 中完成的,不是吗?在“标准”JavaScript SDK 中,我们甚至没有 CollectionReference 对象的这个属性
    • @RenaudTarnec 添加.ref 将其转换为原生firebase.firestore.CollectionReference。所以区别在于没有.refdoc() 它是另一个接受参数的函数(AngularFirestoreDocument
    猜你喜欢
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多