Firestore Получение идентификатора документа из коллекции
Я пытаюсь получить мои документы с идентификатором, но не могу понять это.
В настоящее время я извлекаю свои документы следующим образом:
const racesCollection: AngularFirestoreCollection<Races> = this.afs.collection('races');
return racesCollection.valueChanges();
Я действительно получаю список своих документов, но с ними нет идентификатора doc.
Как я могу получить его для каждого документа?
Ответы
Ответ 1
Я наконец нашел решение. Виктор был близок к данным документа.
const racesCollection: AngularFirestoreCollection<Race>;
return racesCollection.snapshotChanges().map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as Race;
data.id = a.payload.doc.id;
return data;
});
});
ValueChanges() не включает метаданные, поэтому мы должны использовать SnapshotChanges(), когда нам нужен идентификатор документа, а затем правильно его отобразить, как указано здесь. Https://github.com/angular/angularfire2/blob/master/docs/firestore/collections.md
Ответ 2
Чтобы получить идентификатор документов в коллекции, вы должны использовать snapshotChanges()
this.shirtCollection = afs.collection<Shirt>('shirts');
// .snapshotChanges() returns a DocumentChangeAction[], which contains
// a lot of information about "what happened" with each change. If you want to
// get the data and the id use the map operator.
this.shirts = this.shirtCollection.snapshotChanges().map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as Shirt;
const id = a.payload.doc.id;
return { id, ...data };
});
});
Документация https://github.com/angular/angularfire2/blob/7eb3e51022c7381dfc94ffb9e12555065f060639/docs/firestore/collections.md#example
Ответ 3
Для angular6+
this.shirtCollection = afs.collection<Shirt>('shirts');
this.shirts = this.shirtCollection.snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as Shirt;
const id = a.payload.doc.id;
return { id, ...data };
});
})
);
Ответ 4
doc.id
получает UID.
Объедините с остальными данными для одного объекта:
Object.assign({ uid: doc.id }, doc.data())
Ответ 5
Может получать идентификатор перед добавлением документов в базу данных:
var idBefore = this.afs.createId();
console.log(idBefore);
Ответ 6
Попробовали это!
colWithIds$<T>(ref: CollectionPredicate<T>, queryFn?): Observable<any[]> {
return this.col(ref, queryFn).snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data();
const id = a.payload.doc.id;
return { id, ...data };
});
}));
}
но я столкнулся с этой ошибкой
[ts] Типы спредов могут создаваться только из типов объектов. const данные: T
Ответ 7
Для angular 8 и Firebase 6 вы можете использовать поле id опции
getAllDocs() {
const ref = this.db.collection('items');
return ref.valueChanges({idField: 'customIdName'});
}
это добавляет идентификатор документа к объекту с указанным ключом (customIdName)