如果知道其路径是否存在,则检查Firestore记录是否存在的最佳方法是什么?

时间:2017-11-15 13:04:00

标签: firebase angularfire2 google-cloud-firestore

给定一个给定的Firestore路径,检查该记录是否存在的最简单,最优雅的方法是不是创建一个可观察的文档并订阅它?

6 个答案:

答案 0 :(得分:13)

看看this question看起来.exists()仍然可以像标准的Firebase数据库一样使用。此外,您可以在github here

上找到更多关于此问题的人

documentation

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")
}));