给定一个给定的Firestore路径,检查该记录是否存在的最简单,最优雅的方法是不是创建一个可观察的文档并订阅它?
答案 0 :(得分:13)
看看this question看起来.exists()
仍然可以像标准的Firebase数据库一样使用。此外,您可以在github here
var cityRef = db.collection('cities').doc('SF');
var getDoc = cityRef.get()
.then(doc => {
if (!doc.exists) {
console.log('No such document!');
} else {
console.log('Document data:', doc.data());
}
})
.catch(err => {
console.log('Error getting document', err);
});
答案 1 :(得分:3)
如果模型包含太多字段,最好在CollectionReference::get()
结果上应用字段掩码(让我们保存更多的Google云流量计划,\ o /)。因此,最好选择使用CollectionReference::select()
+ CollectionReference::where()
仅选择我们要从Firestore获取的内容。
假设我们具有与Firestore cities example相同的收集架构,但是文档中的id
字段的值与doc::id
相同。然后,您可以这样做:
var docRef = db.collection("cities").select("id").where("id", "==", "SF");
docRef.get().then(function(doc) {
if (!doc.empty) {
console.log("Document data:", doc[0].data());
} else {
console.log("No such document!");
}
}).catch(function(error) {
console.log("Error getting document:", error);
});
现在,我们仅下载city::id
而不是下载整个文档来检查它是否存在。
答案 2 :(得分:2)
检查一下:)
var doc = firestore.collection('some_collection').doc('some_doc');
doc.get().then((docData) => {
if (docData.exists) {
// document exists (online/offline)
} else {
// document does not exist (only on online)
}
}).catch((fail) => {
// Either
// 1. failed to read due to some reason such as permission denied ( online )
// 2. failed because document does not exists on local storage ( offline )
});
答案 3 :(得分:0)
我最近在使用Firebase Firestore时遇到了相同的问题,并且我采用以下方法来克服它。
mDb.collection("Users").document(mAuth.getUid()).collection("tasks").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
if (task.getResult().isEmpty()){
Log.d("Test","Empty Data");
}else{
//Documents Found . add your Business logic here
}
}
}
});
task.getResult()。isEmpty()提供了一种解决方案,即是否找到针对我们查询的文档
答案 4 :(得分:0)
取决于所使用的库,它可能是可观察的,而不是承诺。只有一个承诺才会有“ then”声明。您可以使用'doc'方法而不是collection.doc方法或toPromise()等。这是doc方法的示例:
let userRef = this.afs.firestore.doc(`users/${uid}`)
.get()
.then((doc) => {
if (!doc.exists) {
} else {
}
});
})
希望这对您有帮助...
答案 5 :(得分:0)
如果出于任何原因,您想要在angular中使用可观察的rxjs而不是promise:
this.afs.doc('cities', "SF")
.valueChanges()
.pipe(
take(1),
tap((doc: any) => {
if (doc) {
console.log("exists");
return;
}
console.log("nope")
}));