Angular 将子集合添加为单个ID文档Firestore的一部分
我正在尝试将多个图像(以前加载到存储器中)的URL保存在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
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
),它接受一个参数