1. 程式人生 > >node實現電影列表 排序、按照區間查詢功能、去重功能、搜尋功能

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、應用場景