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

原创 纤纤郡主 教程 HTML5 60阅读 2018-10-31 16:32:07 举报

目标

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

复习: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、应用场景

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复