Esta es la solución más acertada que encomtrarás dar, sin embargo mírala pausadamente y analiza si es compatible a tu trabajo.
Solución:
A partir del 10 de mayo de 2019 ahora puede usar:
valueChanges(idField?: string)
y pase un nombre de campo opcional que contendrá la identificación del documento.
Como en tu publicación original:
get_the_posts()
this.Post_collection = this.afs.collection('posts');
return this.Posts = this.Post_collection.valueChanges( idField: 'id' );
De hecho, esto devolvería sus objetos en la salida deseada.
De la documentación de las colecciones:
Transmisión de datos de recopilación
Hay varias formas de transmitir datos de recopilación desde Firestore.
valueChanges(idField?: string)
¿Qué es? – El estado actual de tu colección. Devuelve un Observable de datos como sincronizado array de objetos JSON. Todos los metadatos de la instantánea se eliminan y solo se incluyen los datos del documento. Opcionalmente, puede pasar un objeto de opciones con un idField key que contiene un string. Si se proporciona, los objetos JSON devueltos incluirán su ID de documento asignado a una propiedad con el nombre proporcionado por idField.
[Emphasis mine]
.valueChanges()
devuelve solo datos sin metadatos. puedes usar .snapshotChanges()
para eso
this.Post_collection = this.afs.collection('posts');
return this.Posts = this.Post_collection.snapshotChanges().map(actions =>
return actions.map(a =>
const data = a.payload.doc.data();
const id = a.payload.doc.id;
return id, ...data ;
);
);
también importar import Observable from 'rxjs/Observable';
Para su segunda pregunta, cómo agregar una identificación al enviar datos a Firestore. probar
//get id from firestore
let id = this.afs.createId();
this.post =
id:id,
name:'name',
description:'description'
this.afs.collection('posts').doc(id).set(this.post).then();
Ahora puedes usar .valueChanges()
para obtener los datos.
Me molestó tanto que no haya un método para esto, así que hice uno para compartir con todos. Algo tan básico debería estar integrado en la propia biblioteca.
getCollectionWithIDs(collection,key,comparison,value)
return this.afs.collection(collection, ref =>
ref.where(
key, comparison, value
)).snapshotChanges().pipe(
map(actions => actions.map(a =>
const data = a.payload.doc.data();
const id = a.payload.doc.id;
return id, ...data ;
)))
Tenga en cuenta que this.afs es del tipo AngularFirestore que debería estar en el constructor.
Si sostienes alguna desconfianza y capacidad de limar nuestro sección puedes dejar una referencia y con mucho gusto lo analizaremos.