Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 将子集合添加为单个ID文档Firestore的一部分_Angular_Firebase_Google Cloud Firestore_Angularfire2 - Fatal编程技术网

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

Angular 将子集合添加为单个ID文档Firestore的一部分,angular,firebase,google-cloud-firestore,angularfire2,Angular,Firebase,Google Cloud Firestore,Angularfire2,我正在尝试将多个图像(以前加载到存储器中)的URL保存在firestore文档的子集合中 到目前为止,我已经实现了这一点,但它为每个图像生成了一个文档(及其各自的子集合img),这不是我想要的: 我希望在子集合img中生成每个文档: 我知道函数guardarImagen()是由每个图像迭代的,但我不知道如何将其分离,以便在第一级生成单个文档(在第二级,它将是子集合,如果迭代了,就可以了),我不知道自己是否被理解 从'@angular/core'导入{Injectable}; 从“angul

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

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

我希望在子集合
img
中生成每个文档:

我知道函数
guardarImagen()
是由每个图像迭代的,但我不知道如何将其分离,以便在第一级生成单个文档(在第二级,它将是子集合,如果迭代了,就可以了),我不知道自己是否被理解

从'@angular/core'导入{Injectable};
从“angularfire2/firestore”导入{AngularFirestore};
从“firebase/app”导入*作为firebase;
从“../class/file item”导入{FileItem};
@注射的({
providedIn:'根'
})
出口级汽车图像服务{
private myFolder='img';
构造函数(私有数据库:AngularFirestore){}
cargarImagenesFirebase(imagenes:FileItem[]){
const myTest=this.db.collection('test').ref.doc();
console.log(myTest.id)
const storageRef=firebase.storage().ref();
用于(图像的常量项){
item.estaSubiendo=true;
如果(item.progreso>=100){
继续;
}
const uploadTask:firebase.storage.uploadTask=
storageRef.child(`this.myFolder}/${item.nombreArchivo}`)
.put(项目存档);
uploadTask.on(firebase.storage.TaskEvent.STATE_已更改,
(快照:firebase.storage.UploadTaskSnapshot)=>
item.progreso=(snapshot.bytesttransfered/snapshot.totalBytes)*100,
(错误)=>控制台错误('error al subir',error),
() => {
控制台日志(“Imagen cargada correctamente”);
uploadTask.snapshot.ref.getDownloadURL()。然后((downloadURL)=>{
item.url=下载url;
item.estaSubiendo=false;
这是瓜达里根({
nombre:item.nombreArchivo,
url:item.url
});
});
});
}
}
guardarImagen(imagen:{nombre:string,url:string}){
this.db.collection('test2').ref.doc();
}

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

 this.db.collection('test2').ref.doc().collection(`/${this.myFolder}`).add(imagen);
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);
}
事实上你做了
doc()

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

你应该这样做:

this.db.collection('test2').ref.doc('myDoc1').collection(`/${this.myFolder}`).add(imagen);
i、 e.指定要填充子集合的文档,而不是在每次调用函数时创建一个新文档(通过调用
doc()
生成自动生成的唯一ID,无任何路径)


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

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

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

 this.db.collection('test2').ref.doc().collection(`/${this.myFolder}`).add(imagen);
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);
}

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

我同意,但作为替换,
myDoc1
是一个自动生成的ID,或者在任何情况下,每次上载图像时都是一个不同的文档?抱歉,我不理解您的评论。请你再详细一点好吗?我如何制作
myDoc1
,然后是
myDoc2
myDoc3
等等。或者在任何情况下使用不同的ID?我认为您应该使用您在顶部创建的myTest文档。我知道你得到了一组图像,你想存储在文档下的子集合中。因此,首先创建文档(在本例中使用
doc()
),然后在图像上迭代以填充sub-collection.Exact!这正是我试图做的,如果你有任何参考或例子,这将是伟大的,我支持你的帮助。感谢你详细阐述现有的讨论!我想在angularfire2中添加
.ref
是应该的,不是吗?在“标准”JavaScript SDK中,对于
CollectionReference
object@RenaudTarnec添加
.ref
将其转换为本机
firebase.firestore.CollectionReference
。因此,区别在于没有
.ref
doc()
它是另一个函数(
AngularFirestoreDocument
),它接受一个参数