首页 > 解决方案 > 如何使用firestore orderBy但也添加未定义的值

问题描述

我从trained_on desc 订购的firestore 获取锻炼。

  useEffect(() => {
    let user = firebase.auth().currentUser;
    const database = firebase.firestore();
    const unsubscribe = database
      .collection("workouts")
      .where("uId", "==", user.uid)
      .orderBy("trained_on", "desc")
      .onSnapshot((snapshot) => {
        setWorkouts(
          snapshot.docs.map((doc) => ({ id: doc.id, ...doc.data() }))
        );
      });

    return () => {
      unsubscribe();
    };
  }, []);

这是忽略未设置trained_on 的条目。当我创建一个新的锻炼时,没有“trained_on”。

如何添加条目,其中受过训练的_on 也未定义?

标签: javascriptreactjsfirebasegoogle-cloud-firestore

解决方案


您无法查询 firestore 中不存在的字段。字段“trained_on”需要存在才能让 Firestore 索引知道它。

引用官方文档,https://firebase.google.com/docs/firestore/query-data/order-limit-data#order_and_limit_data

限制 请注意 orderBy() 子句的以下限制:

orderBy() 子句还过滤给定字段的存在。结果集将不包括不包含给定字段的文档。

此限制的一种可能解决方法是您使用单独的查询获取所有现有文档,然后手动从查询结果中减去这些文档。或者,也许您可​​以在所需文档中包含“trained_on”字段的标记值,例如null. orderBy() 子句适用于null值。


推荐阅读