目标
电影列表 排序、按照区间查找功能、去重功能、搜索功能
复习: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、应用场景