如何在 Firebase v9 中过滤数据
How to filter Data in Firebase v9
大家好,我有一个关于如何 search/filter Firestore 和 React js 中的数据的问题,如果有人能提供帮助的话会很好。
所以让我描述一下我的问题。
首先,我创建了一个名为 firearms 的集合,其中包含文档
还有 user.uid .
在这份文件中,我创建了一个包含自动生成文件的子集,它们都有两个值,即枪支名称和制造商名称。
这意味着如果用户有两支枪支,他会在子集合中为每支枪支存储两个文档。
// firearms/auth.currentUser.uid/firearmssubcollection/auto-IDs
字段值 [名称、制造商]
我的目标是在搜索特定枪支后向其他用户显示集合 'firearms' 中的(制造商)。
如果我使用自动完成搜索让我们说
巴雷塔
我收到了当前登录用户的所有 Baretta 手枪,但我需要所有用户的 Baretta 手枪,而不仅仅是登录用户的一把。
import React, {useState, useEffect} from 'react';
import { collection, query, where, getDocs } from "firebase/firestore"
import { db, auth } from '../firebaseConfig';
import Autocomplete from '@mui/material/Autocomplete';
function Suche() {
const [kurzHersteller, setKurzHersteller] = useState();
const kurzHerstellerArray = [ 'Andere','Baretta', 'Walther', 'Haenal']
const handleClick = async () => {
const kurzRef = collection(db, `kurzwaffen/${auth.currentUser.uid}/kurzwaffensub`);
const q = query(kurzRef, where("kurzHersteller", "==", `${kurzHersteller}`));
const querySnapshot = await getDocs(q);
querySnapshot.forEach((doc) => {
// doc.data() is never undefined for query doc snapshots
console.log(doc.id, " => ", doc.data());
});
}
return (
<ThemeProvider theme={theme}>
<Box sx={{ marginLeft: {lg:'15vw', md:'0vw', sm:'0vw', xs:'0vw'}, padding:{lg:4 ,md:4 ,sm:4 , xs:0}, paddingBottom:{lg:2, md:15, sm:10, xs:10}}}>
<Grid container spacing={7} alignItems='center' justifyContent='center' >
<Grid item >
<Card className='CardSuche' sx={{ maxWidth: 700 , height: {lg: 900, md: 900, sm: 750, xs: 750}, backgroundColor:'rgba(39, 39, 39, 0.35)', backdropFilter:'blur(6px)', boxShadow:'0 8px 32px 0 rgba(107, 107, 107, 0.37)' }}>
<CardMedia
component="img"
sx={{height: {lg: 500, md: 500, sm:340 , xs: 340}}}
image="../images/1911.jpg"
/>
<Grid container direction='column' spacing={1}>
<CardContent>
< Grid item>
<Typography gutterBottom variant="h5" component="div" color='white'>
Kurzwaffen
</Typography>
</Grid>
< Grid item >
<Typography variant="body2" color="text.secondary">
<Grid container direction='column' justifyContent='center' alignItems='center' spacing={2}>
<Grid item >
<Paper sx={{width:{lg:550 , md:550 ,sm:360, xs:360}, height: 70 }}>
<Autocomplete
disablePortal
id="combo-box-demo"
options={kurzHerstellerArray}
value={kurzHersteller}
onChange={(_event,value) => setKurzHersteller(value)}
sx={{ width: 300 }}
renderInput={(params) =>
<TextField {...params} label="Hersteller"/>}
/>
</Paper>
</Grid>
</Grid>
</Typography>
</Grid>
</Box>
export default Suche;
match /kurzwaffen/{userId}/kurzwaffensub/{waffenID} {
allow write, delete: if request.auth != null && request.auth.uid == userId;
allow read: if request.auth != null;
}
这是我对这个集合的安全规则。
希望你能告诉我我必须更改什么才能收到所有武器,而不仅仅是当前登录用户的武器。
我很笨才发现我的错误^^。
如果您想搜索数据库中的所有 kurzwaffensub
(子)集合,您可以使用 collection group query 来实现。
const kurzRef = collectionGroup(db, 'kurzwaffensub');
大家好,我有一个关于如何 search/filter Firestore 和 React js 中的数据的问题,如果有人能提供帮助的话会很好。
所以让我描述一下我的问题。
首先,我创建了一个名为 firearms 的集合,其中包含文档 还有 user.uid .
在这份文件中,我创建了一个包含自动生成文件的子集,它们都有两个值,即枪支名称和制造商名称。
这意味着如果用户有两支枪支,他会在子集合中为每支枪支存储两个文档。
// firearms/auth.currentUser.uid/firearmssubcollection/auto-IDs
字段值 [名称、制造商]
我的目标是在搜索特定枪支后向其他用户显示集合 'firearms' 中的(制造商)。
如果我使用自动完成搜索让我们说 巴雷塔 我收到了当前登录用户的所有 Baretta 手枪,但我需要所有用户的 Baretta 手枪,而不仅仅是登录用户的一把。
import React, {useState, useEffect} from 'react';
import { collection, query, where, getDocs } from "firebase/firestore"
import { db, auth } from '../firebaseConfig';
import Autocomplete from '@mui/material/Autocomplete';
function Suche() {
const [kurzHersteller, setKurzHersteller] = useState();
const kurzHerstellerArray = [ 'Andere','Baretta', 'Walther', 'Haenal']
const handleClick = async () => {
const kurzRef = collection(db, `kurzwaffen/${auth.currentUser.uid}/kurzwaffensub`);
const q = query(kurzRef, where("kurzHersteller", "==", `${kurzHersteller}`));
const querySnapshot = await getDocs(q);
querySnapshot.forEach((doc) => {
// doc.data() is never undefined for query doc snapshots
console.log(doc.id, " => ", doc.data());
});
}
return (
<ThemeProvider theme={theme}>
<Box sx={{ marginLeft: {lg:'15vw', md:'0vw', sm:'0vw', xs:'0vw'}, padding:{lg:4 ,md:4 ,sm:4 , xs:0}, paddingBottom:{lg:2, md:15, sm:10, xs:10}}}>
<Grid container spacing={7} alignItems='center' justifyContent='center' >
<Grid item >
<Card className='CardSuche' sx={{ maxWidth: 700 , height: {lg: 900, md: 900, sm: 750, xs: 750}, backgroundColor:'rgba(39, 39, 39, 0.35)', backdropFilter:'blur(6px)', boxShadow:'0 8px 32px 0 rgba(107, 107, 107, 0.37)' }}>
<CardMedia
component="img"
sx={{height: {lg: 500, md: 500, sm:340 , xs: 340}}}
image="../images/1911.jpg"
/>
<Grid container direction='column' spacing={1}>
<CardContent>
< Grid item>
<Typography gutterBottom variant="h5" component="div" color='white'>
Kurzwaffen
</Typography>
</Grid>
< Grid item >
<Typography variant="body2" color="text.secondary">
<Grid container direction='column' justifyContent='center' alignItems='center' spacing={2}>
<Grid item >
<Paper sx={{width:{lg:550 , md:550 ,sm:360, xs:360}, height: 70 }}>
<Autocomplete
disablePortal
id="combo-box-demo"
options={kurzHerstellerArray}
value={kurzHersteller}
onChange={(_event,value) => setKurzHersteller(value)}
sx={{ width: 300 }}
renderInput={(params) =>
<TextField {...params} label="Hersteller"/>}
/>
</Paper>
</Grid>
</Grid>
</Typography>
</Grid>
</Box>
export default Suche;
match /kurzwaffen/{userId}/kurzwaffensub/{waffenID} {
allow write, delete: if request.auth != null && request.auth.uid == userId;
allow read: if request.auth != null;
}
这是我对这个集合的安全规则。
希望你能告诉我我必须更改什么才能收到所有武器,而不仅仅是当前登录用户的武器。
我很笨才发现我的错误^^。
如果您想搜索数据库中的所有 kurzwaffensub
(子)集合,您可以使用 collection group query 来实现。
const kurzRef = collectionGroup(db, 'kurzwaffensub');