有没有办法在 firestore 中查询数据并使用 where() 函数和"array-contains"并遍历数组



学习firestore,并制作一个简单的活动网站来练习搜索查询,用户可以在其中输入他们的城市(selectedCity),然后选择一个活动类别,如"音乐"喜剧";过滤事件。

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

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

任何关于如何解决这个问题的建议都会很有帮助。现在我只是将事件[0]硬编码为"Music"在其中显示所有音乐事件 下面是我的查询代码:
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}`)
});
}

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

听起来您正在从数组查询操作符中寻找array-contains-any:

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

最新更新