Mongodb 中的多条件搜索,但所有搜索字段必须能够有“任意”选项

问题描述 投票:0回答:1

又是我。开门见山: 我的应用程序中有 3 个搜索字段(下拉值选择)来过滤将向用户显示的产品。默认值应该是“任何”,所以如果每个字段都选择了“任何”,它只会从数据库中显示每个产品,如果只有其中一个选择了“任何”,则该搜索条件将被忽略,并且每个产品将显示该字段的任何值。 听起来很简单,但我就是找不到正确的方法,所以我又来了,希望你能帮助我

搜索字段:

const [subject, setSubject] = useState('');
    const [status, setStatus] = useState('');
    const [district, setDistrict] = useState('');


    const handleChange1 = (event) => {
        setSubject(event.target.value);
    };

    const handleChange2 = (event) => {
        setStatus(event.target.value);
    };

    const handleChange3 = (event) => {
        setDistrict(event.target.value);
    };

<FormControl fullWidth>
                             <Select
                                value={subject}
                                label="subject"
                                onChange={handleChange3}
                                
                            >
                                <MenuItem value={''}>all</MenuItem>
                                <MenuItem value={'opt1'}>1</MenuItem>
                                <MenuItem value={'opt2'}>2</MenuItem>
                                <MenuItem value={'opt3'}>3</MenuItem>
                            </Select>
</FormControl>

<FormControl fullWidth>
                             <Select
                                value={status}
                                label="status"
                                onChange={handleChange3}
                                
                            >
                                <MenuItem value={''}>all</MenuItem>
                                <MenuItem value={'opt1'}>1</MenuItem>
                                <MenuItem value={'opt2'}>2</MenuItem>
                                <MenuItem value={'opt3'}>3</MenuItem>
                            </Select>
</FormControl>

<FormControl fullWidth>
                             <Select
                                value={district}
                                label="location"
                                onChange={handleChange3}
                                
                            >
                                <MenuItem value={''}>all</MenuItem>
                                <MenuItem value={'opt1'}>1</MenuItem>
                                <MenuItem value={'opt2'}>2</MenuItem>
                                <MenuItem value={'opt3'}>3</MenuItem>
                            </Select>
</FormControl>

<TutorList subject={subject} status={status} district={district} />

产品加载的页面:

const TutorList = (props) => {
    const [tutors, setTutors] = useState([])

    useEffect(() => {
        const fetchTutors = async () => {
            const data = await axios.get(`/api/v1/user/search`, {
                params: {
                    subject: props.subject,
                    status: props.status,
                    district: props.district
                }
            })

            setTutors(data.data.users)
        }

        fetchTutors()
    }, [props]) 

    return (
        <Fragment>
            {tutors.map((tutor) => (
                ...
            ))}
        </Fragment>
    )
}

后端:

exports.search = async (request, response, next) => {
    const subjectName = request.query.subject
    const statusName = request.query.status
    const districtName = request.query.district

    const users = await User.find({
        subject: subjectName, 
        district: districtName, 
        students: statusName
    })

    if (!users) {
        return next(
            new ErrorResponse(`Users with these parameters don't exist`, 404)
        )
    }

    response.status(200).json({ success: true, users: users })
}

对此有什么想法吗?如果所有字段都指定了值,则它工作得很好,但当其中一个搜索字段为空(选择了“any”选项)时,它会停止工作。

node.js reactjs search mongodb-query mern
1个回答
0
投票

您似乎想要过滤值为

''
或 false 值的查询参数。

例如如果

district
''
,则会被过滤。

const request = {
  query: {
    subject: '1',
    status: 'ok',
    district: ''
  }
}

const query = Object.fromEntries(Object.entries(request.query).filter(value => value[1]))

console.log(query)

// User.find(query)

© www.soinside.com 2019 - 2024. All rights reserved.