我正在尝试将多个图像的URL(以前加载到Storage中)保存在Firestore文档的子集合中。
到目前为止,我已经实现了它,但是它为每个图像生成了一个文档(带有其各自的子集合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);
}
}
答案 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);
}
为简单起见,我省略了上传/存储部分。