javascript Firestore通过搜索其字段获得单个元素

eagi6jfj  于 2023-08-02  发布在  Java
关注(0)|答案(2)|浏览(97)

我收集了很多餐馆。

的数据
我想检索单个文档。但是,我没有documentID,我只有电子邮件,所以我想写一个查询,当我给予它一个电子邮件字段是唯一的,将不会有重复的文档。
我现在正在使用这个愚蠢的查询:

const q = query(
        collection(fireStore, "restaurant"),
        where("email", "==", user?.email),
        limit(1)
      )
      const querySnapshot = await getDocs(q);
      querySnapshot.forEach((doc) => {
         setRestaurant(doc.data());
      });

字符串
querySnapshot是一个包含单个元素的数组。
有没有可能写一个查询,返回单个文档,而不是单个文档的数组?
或者你也可以建议更好的方法来做这件事,比如首先找到documentID,然后用documentID检索。

a1o7rhls

a1o7rhls1#

由于一个查询可以匹配多个文档,因此它总是返回一个QuerySnapshot,并且总是包含一个文档数组。即使查询只返回一个文档,它也将是QuerySnapshot和数组的形式。
如果你知道只有一个文档,或者如果你只关心结果的第一个文档,你可以访问它而不需要循环:

const doc = querySnapshot.docs[0];
setRestaurant(doc.data());

字符串

bq3bfh9z

bq3bfh9z2#

作为Frank's answer的替代方案,您还可以创建自己的getter函数,该函数返回第一个结果,就像使用getDoc()一样。

async function getFirstDoc(queryObj) {
    const querySnapshot = await getDocs(
      query(queryObj, limit(1)) // adds the limit constraint for efficiency
    );
    return querySnapshot.docs[0]
      || {
        exists: () => false,
        get: () => undefined,
        data: () => undefined
      };
}

字符串
然后你可以像这样在代码中的其他地方使用它:

const q = query(
  collection(fireStore, "restaurant"),
  where("email", "==", user?.email)
);

const doc = await getFirstDoc(q);
setRestaurant(doc.data()); // assuming doc always exists, otherwise check doc.exists()

相关问题