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