【问题标题】:Right approch to filter data from database从数据库中过滤数据的正确方法
【发布时间】:2022-01-22 20:48:08
【问题描述】:

我的问题是,这是从数据库中过滤和获取特定数据的好方法,还是会在将来对我的数据库施加压力,并处理所有查询。我使用它来向用户建议基于他的关键字而不是一个直接的 API 响应的获取列表。顺便使用 react。

const [data,setData] = useState([]);
const [keyword,setKeyword] = useState('');

 useEffect(() => {
    const fetchData = async keyword => {
      let filteredUsers;
      try {
        const res = await axios.get('/api/users');
        filteredUsers= res.data.filter(user=>
          user.username.toLowerCase().includes(keyword)
        );
        setData(filteredUsers);
      } catch (error) {
        console.error(error);
      }
      setLoadingdata(false);
    };

    keyword.length > 1 && fetchData(keyword);
  }, [keyword]);

后端:

router.get('/', async (req, res) => {
  try {
    const users = await User.find();
    res.json(users);
  } catch (error) {
    console.log(error.message);
    res.status(500).send('Server Error');
  }
});

【问题讨论】:

  • 但这是前端代码,对吧?您可以改进您的查询,在数据库中进行过滤并仅返回您想要的元素。您可以在 mongo 查询中使用正则表达式来获取所需的用户。请发布后端代码。
  • @J.F.是的,这是前端。在后端,每次更改关键字时,我似乎都会获取数据库中的每个用户。对不起,我正在学习猫鼬,还是个新手。

标签: database mongodb mongoose


【解决方案1】:

您的代码现在从数据库加载所有数据并在前端进行过滤。这不是一个好方法。

您必须在 mongo 查询中进行过滤并仅返回您想要的值。所以你可以试试这段代码:

前端执行此调用(或您为 URL 设计的任何其他结构):

const res = await axios.get($'/api/users/{keyword}');

还有后端

router.get('/', async (req, res) => {
  try {
    const users = await User.find({
      username: {
        $regex: req.params.user,
        $options: "i"
      }
    });
    res.json(users);
  } catch (error) {
    console.log(error.message);
    res.status(500).send('Server Error');
  }
});

此查询使用带有选项i 的正则表达式,这意味着不区分大小写。但也许您不想要这个选项,只需从前端发送小写的keyword

无论如何,正确的方法是生成“REST URL”并使用数据库中的查询在后端进行过滤。这样前端只会收到你想要的数据。

查询如何工作的示例here

【讨论】:

  • 非常感谢。我知道从数据库中获取所有数据在某种程度上是一种不好的做法,但我对如何改进整个过程没有太多想法。
猜你喜欢
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多