我试图用id检索我的文件,但无法弄明白。
目前我检索这样的文件:
const racesCollection: AngularFirestoreCollection<Races> = this.afs.collection('races');
return racesCollection.valueChanges();
我确实完整地获得了我的文档列表,但是没有文档ID。
如何为每个文档检索它?
答案 0 :(得分:26)
要获取集合中文档的ID,您必须使用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 };
});
});
答案 1 :(得分:23)
我终于找到了解决方案。维克多与博士数据很接近。
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()不包含元数据,因此我们必须在需要文档ID时使用SnapshotChanges(),然后按照此处所述正确映射https://github.com/angular/angularfire2/blob/master/docs/firestore/collections.md
答案 2 :(得分:23)
对于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 };
});
})
);
答案 3 :(得分:11)
由于您使用的是angularFire,因此如果要返回默认的Firebase方法进行实现则没有任何意义。 AngularFire本身已实现了适当的机制。只需使用它即可。
通过简单地将对象作为 parameter 添加到方法中,angularFire的 valueChanges()
方法提供了重载,以获取集合中每个文档的ID。
valueChanges({ idField: 'id' })
“ idField”必须与原样相同。 “ id”可以是您希望调用文档ID的任何内容。
然后,返回数组上的每个文档对象将如下所示。
{
field1 = <field1 value>,
field2 = <field2 value>,
..
id = 'whatEverTheDocumentIdWas'
}
然后,您可以通过引用您命名的字段来轻松获取文档ID。
AngularFire 5.2.0
答案 4 :(得分:6)
doc.id
获取UID。
结合一个对象的其余数据,如下所示:
Object.assign({ uid: doc.id }, doc.data())
答案 5 :(得分:3)
对于文档参考而非收藏,您需要:
// when you know the 'id'
this.afs.doc(`items/${id}`)
.snapshotChanges().pipe(
map((doc: any) => {
const data = doc.payload.data();
const id = doc.payload.id;
return { id, ...data };
});
为.valueChanges({ idField: 'id'});
的功能在这里不起作用。我认为它没有实现,因为通常您通过id搜索文档...
答案 6 :(得分:2)
在数据库中添加文档之前可以获取ID:
var idBefore = this.afs.createId();
console.log(idBefore);
答案 7 :(得分:2)
对于angular 8和Firebase 6,您可以使用选项ID字段
getAllDocs() {
const ref = this.db.collection('items');
return ref.valueChanges({idField: 'customIdName'});
}
这会使用指定的键(customIdName)在对象上添加文档的ID
答案 8 :(得分:0)
尝试过!
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
答案 9 :(得分:0)
我已经尝试过
return this.db.collection('items').snapshotChanges().pipe(
map(actions => {
return actions.map(a => {
const data = a.payload.doc.data() as Item;
data.id = a.payload.doc.id;
data.$key = a.payload.doc.id;
return data;
});
})
);