You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过点击按钮返回MongoDB数据库的排序结果?

实现MongoDB电影数据按评分排序的两种方案

你的现有后端路由代码如下:

router.get('/', (req, res) =>{
    FILM
        .find().limit(6)
        .then(films => res.render('index.ejs', {films}))
})

下面是两种可行的排序实现方式:

方案一:后端排序(基于MongoDB查询)

这种方式通过向后端传递排序参数,由MongoDB直接返回排序后的结果,适合数据量较大的场景。

步骤1:修改后端路由

添加对请求参数的判断,根据参数指定排序规则:

router.get('/', (req, res) =>{
    // 获取排序参数,默认按评分降序
    const sortRule = req.query.sort === 'asc' ? { rating: 1 } : { rating: -1 };
    FILM
        .find()
        .sort(sortRule) // 1为升序,-1为降序
        .limit(6)
        .then(films => res.render('index.ejs', {films, currentSort: req.query.sort}))
})

步骤2:在index.ejs中添加排序按钮

通过链接传递排序参数:

<div class="sort-buttons">
    <a href="/?sort=asc" class="btn">评分从低到高</a>
    <a href="/?sort=desc" class="btn">评分从高到低</a>
</div>

<!-- 渲染电影列表 -->
<div class="film-list">
    <% films.forEach(film => { %>
        <div class="film-item">
            <h3><%= film.title %></h3>
            <p>评分:<%= film.rating %></p>
        </div>
    <% }) %>
</div>

方案二:前端排序(纯JavaScript处理)

这种方式一次性把数据加载到前端,通过JS对数组排序后重新渲染DOM,适合数据量较小的场景,无需频繁请求后端。

步骤1:在index.ejs中保存数据并添加按钮

把电影数据转成JSON字符串存在页面,同时添加排序按钮:

<div class="sort-buttons">
    <button onclick="sortFilms('asc')" class="btn">评分从低到高</button>
    <button onclick="sortFilms('desc')" class="btn">评分从高到低</button>
</div>

<div id="filmList" class="film-list">
    <% films.forEach(film => { %>
        <div class="film-item">
            <h3><%= film.title %></h3>
            <p>评分:<%= film.rating %></p>
        </div>
    <% }) %>
</div>

<script>
    // 保存原始电影数据
    const originalFilms = <%= JSON.stringify(films) %>;
    const filmListEl = document.getElementById('filmList');

    function sortFilms(order) {
        // 复制数组避免修改原始数据
        const sortedFilms = [...originalFilms].sort((a, b) => {
            return order === 'asc' ? a.rating - b.rating : b.rating - a.rating;
        });
        // 重新渲染电影列表
        renderFilms(sortedFilms);
    }

    function renderFilms(films) {
        filmListEl.innerHTML = films.map(film => `
            <div class="film-item">
                <h3>${film.title}</h3>
                <p>评分:${film.rating}</p>
            </div>
        `).join('');
    }
</script>

两种方案对比

  • 后端排序:数据量大时更高效,MongoDB可利用索引优化查询;每次排序需刷新页面或发起AJAX请求。
  • 前端排序:无需后端请求,交互更流畅,但仅适合数据量小的场景,需一次性加载所有数据到前端。

内容的提问来源于stack exchange,提问作者GoRvAnOv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:09:15