Firestore按字段值检索单个文档并更新

时间:2020-11-04 14:56:23

标签: javascript firebase google-cloud-firestore

我正在尝试通过字段值检索单个文档,然后更新其中的一个字段。 当我执行.where("uberId", "==",'1234567')时,我将获得字段uberId1234567匹配的所有文档。 我可以肯定只有一个这样的文件。但是,我不想使用uberId作为文档的ID,否则我可以轻松地通过ID搜索该文档。是否有另一种通过字段ID搜索单个文档的方法?

到目前为止,阅读文档,我可以看到以下内容:

const collectionRef = this.db.collection("bars");
const multipleDocumentsSnapshot = await collectionRef.where("uberId", "==",'1234567').get();

然后我想我可以const documentSnapshot = documentsSnapshot.docs[0]来获取唯一的现有文档参考。

但是我想用以下内容更新文档:

documentSnapshot.set({
  happy: true
}, { merge: true })

我遇到错误Property 'set' does not exist on type 'QueryDocumentSnapshot<DocumentData>'

2 个答案:

答案 0 :(得分:0)

虽然可能实际上知道只有一个具有给定uberId值的文档,但API无法知道这一点。因此,API会为任何查询返回相同的类型:QuerySnapshot。您将需要遍历该快照中的结果以获取文档。即使只有一个文档,您也需要该循环:

const querySnapshot = await collectionRef.where("uberId", "==",'1234567').get();
querySnapshot.forEach((doc) => {
  doc.ref.set(({
    happy: true
  }, { merge: true })
});

代码.ref中缺少的是:您无法更新DocumentSnapshot / QueryDocumentSnapshot,因为它只是数据库中数据的本地副本。因此,您需要对其调用ref以获得对数据库中该文档的引用。

答案 1 :(得分:0)

async function getUserByEmail(email) {
  // Make the initial query
  const query = await db.collection('users').where('email', '==', email).get();

   if (!query.empty) {
    const snapshot = query.docs[0];
    const data = snapshot.data();
  } else {
    // not found
  }

}