繁体   English   中英

在 firestore 中查询数据并遍历数组时,有没有办法使用 where() function 和“array-contains”

[英]Is there a way to use the where() function and "array-contains" when querying data in firestore and iterate through an array

了解 firestore 并制作一个简单的活动网站来练习搜索查询,用户可以在其中输入他们的城市 (selectedCity),然后 select 一个活动类别,例如“音乐”、“喜剧”、“酒吧”来过滤活动。

我有一个动态的事件数组。 用户可以单击屏幕一侧的事件类型,它会根据选择的类别填充事件数组。 例如:如果我选择过滤“音乐”、“喜剧”和“酒吧”,那么事件数组将包含这 3 个。

我想知道是否有一种方法可以遍历数组以查看存储在 FireStore 中的已发布事件的类别是否与事件数组中的任何事件匹配。

有关如何解决此问题的任何提示都会有所帮助。 现在我只是硬编码事件[0],其中作为“音乐”显示所有音乐事件

这是我的查询代码:

    const [postsList, setPostsList] = useState([])
    const [value, setValue] = useState("");
    const [selectedCity, setSelectedCity] = useRecoilState(selectedCityState);
    const dbRef = collection(db, "posts");

    const [events, setEvents] = useState([
        "Music",
        "Comedy", 
        "Bars", 
      ])


const getPostsAPI = async () => {
        const data = [];
        const q = query(
                dbRef, 
                where("cityName", "==", selectedCity), 
                where("category", "array-contains", events[0]),
                orderBy("timestamp", "desc"));
        const posts = await onSnapshot(q, (querySnapshot) => {
             querySnapshot.docs.map(d => d.data().length)
            querySnapshot.forEach(doc => {
                data.push(
                    { 
                        companyName: doc.data().companyName,
                        endTime: doc.data().endTime,
                        eventAddress: doc.data().eventAddress,
                        eventDescription: doc.data().eventDescription,
                        startTime: doc.data().startTime,
                        startDay: doc.data().startDay,
                        timestamp: doc.data().timestamp,
                        username: doc.data().username,
                        venueName: doc.data().venueName,
                        imageLink: doc.data().imageLink,
                        startMonth: doc.data().startMonth,
                        startDate: doc.data().startDate,
                        title: doc.data().title,
                        cityName: doc.data().cityName,
                        videoLink: doc.data().videoLink,
                    })
            })
            setPostsList(data);
        }, (error) => {
            console.log(`PostAPI error: ${error}`)
        });
    }

我尝试将数组作为一个整体传入,认为 function 可能会将两者进行比较,但这是不正确的。 试图找出解决此问题的最佳方法,以及是否必须重组我的代码。 我知道你最多只能有 10 个 where(),但我认为我不需要这样做,我也不认为这是最有效的解决方案。

听起来您正在从数组查询运算符中寻找array-contains-any

query(
  dbRef, 
  where("cityName", "==", selectedCity), 
  where("category", "array-contains-any", events), // 👈
  orderBy("timestamp", "desc")
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM