node实现电影列表 排序、按照区间查找功能、去重功能、搜索功能

目标

电影列表 排序、按照区间查找功能、去重功能、搜索功能

  复习:eval函数的使用场景、数组去重(至少你要懂得6种)

排序  ---- **.**.find().sort()  ------ (查询所有的数据,然后按照某一个字段进行排序)

var arr = [{a:1},{a:3},{a:2},{a:7},{a:4}];

arr.sort((x,y)=>{

    return x.a - y.a;

})

console.log(arr)

  1、movie.ejs中添加排序的路由,type表示按照什么进行排序,num表示升序还是降序,1表示升序,-1表示降序

<a href = "/sortMovieRoute?type=average&num=1">评分升序</a>

<a href = "/sortMovieRoute?type=average&num=-1">评分降序</a>

<a href = "/sortMovieRoute?type=year&num=1">上映时间升序</a>

 <a href = "/sortMovieRoute?type=year&num=-1">上映时间降序</a>

  2、movie.js中定义路由 movie.sortMovieRoute

  内部多加一层去重上映时间yearArr,应用的是node异步编程思想(后期所加的)

sortMovieRoute: ( req, res, next) => {

        var { type, num } = url.parse( req.url, true ).query;

        

//         var sortObj = {

//             "year": num * 1

//         }

//          var sortObj = {}

//         switch ( type ){

//             case 'year':

//                  sortObj = { year: num}

//                 break;

//             default:

//                 break;

//         }

        var sortObj = {};// style.display   style['display']

        sortObj[type] = num*1;

        

        async.waterfall([

            ( cb ) => {

                MongoClient.connect( mongoUrl, ( err, db ) => {

                    if ( err ) throw err;

                    cb( null, db );

                })

            },

          ( db, cb ) => {

              db.collection('movie').distinct('year', ( err, yearArr) => {

                  if ( err ) throw err;

                  cb( null, db, yearArr);

              })

          },

            ( db, yearArr, cb ) => {

                db.collection('movie').find( {}, {} ).sort( sortObj ).toArray( ( err, res ) => {

                    if ( err ) throw err;

                    cb( null, {

                res,

                yearArr

              });

                    db.close();

                })

            }

        ],( err, result ) => {

            var len = result.res.length;

            res.render('movie', {

                result:result.res,

                len,

                yearArr: result.yearArr

            });

        })

    },

  3、注册路由 index.js

router.get('/sortMovieRoute', movie.sortMovieRoute);

  4、应用场景: ---- 分类页面

     距离排序、价格排序、销量排序

按照区间查找功能

  1、movie.ejs中添加路由,type表示依据哪个字段查询,min是最小值,max值是最大值

<a href = "/areaQueryMovieRoute?type=average&min=9.4&max=9.6">查找平均分为9.4-9.6之间的数据</a>

  2、定义路由 movie.areaQueryMovieRoute

areaQueryMovieRoute: ( req, res, next ) => {

        

        var { type, min, max } = url.parse( req.url, true ).query;

        

        var whereObj = {}

        whereObj[type] = {

            $gte: min * 1,

            $lte: max * 1

        }

        async.waterfall([

            ( cb ) => {

                MongoClient.connect( mongoUrl, ( err, db ) => {

                    if ( err ) throw err;

                    cb( null, db );

                })

            },

          ( db, cb ) => {

              db.collection('movie').distinct('year', ( err, yearArr) => {

                  if ( err ) throw err;

                  cb( null, db, yearArr);

              })

          },

            ( db, yearArr, cb ) => {

                db.collection('movie').find( whereObj, {} ).toArray( ( err, res ) => {

                    if ( err ) throw err;

                    cb( null, {

                res,

                yearArr

              });

                    db.close();

                })

            }

        ],( err, result ) => {

            var len = result.res.length;

            res.render('movie', {

                result:result.res,

                len,

            yearArr: result.yearArr

            });

        })

    },

  3、index.js中注册路由

router.get('/areaQueryMovieRoute', movie.areaQueryMovieRoute);

   

  4、应用场景:  ---- 分类页面

     查找在500-1000元之间的产品

去重功能 (查询所有的数据,只显示year,然后按照数组去重取得数据即可)

     1、页面显示数据

<% for(var i = 0; i < yearArr.length; i++ ){%>

                <a href = "/getYearMovie?year=<%= yearArr[i] %>"><%= yearArr[i] %></a>

             <% }%>

  2、定义路由----都是加在了其他路由中,nodejs异步编程串行有关联的第二个函数

 ( cb ) => {

                MongoClient.connect( mongoUrl, ( err, db ) => {

                    if ( err ) throw err;

                    cb( null, db );

                })

            },

          ( db, cb ) => {

              db.collection('movie').distinct('year', ( err, yearArr) => {

                  if ( err ) throw err;

                  cb( null, db, yearArr);

              })

          },

            ( db, yearArr, cb ) => {

                db.collection('movie').find( whereObj, {} ).toArray( ( err, res ) => {

                    if ( err ) throw err;

                    cb( null, {

                res,

                yearArr

              });

                    db.close();

                })

            }

   

    4、应用场景 ----- 分类页面

     品牌、产品数据多次重复只需要一次时

搜索功能

  1、编写页面

<div class="pull-right">

        <input type="text" placeholder='请输入电影名称搜索' id='searchInput' onchange = "searchMovie()"/>

      </div>

function searchMovie () {

      var val = $("#searchInput").val();

      window.location.href = "/searchMovie?title="+val

    }

  2、定义路由 /title/ 包含查询  /^title/  以**开头查询   ---- 模糊查询

searchMovie: ( req, res, next ) => {

       var { title } = url.parse( req.url, true ).query;

       async.waterfall([

           ( cb ) => {

               MongoClient.connect( mongoUrl, ( err, db ) => {

                   if ( err ) throw err;

                   cb( null, db );

               })

           },

           ( db, cb ) => {

               db.collection('movie').distinct('year', ( err, yearArr) => {

                   if ( err ) throw err;

                   cb( null, db, yearArr);

               })

           },

           ( db, yearArr, cb ) => {

               db.collection('movie').find( {title: eval("/^"+title+"/")}, {} ).toArray( ( err, res ) => {

                   if ( err ) throw err;

                   cb( null, {

                       res,

                       yearArr

                   });

                   db.close();

               })

           }

       ],( err, result ) => {

           var len = result.res.length;

           res.render('movie', {

               result:result.res,

               len,

               yearArr: result.yearArr

           });

       })

    }

  3、注册路由

router.get('/searchMovie', movie.searchMovie);

  4、应用场景

   

猜你喜欢

转载自blog.csdn.net/xx666zz/article/details/83586018