[node.js][express]RESTful API part2

やりたいこと

mongoDBとつなげてGETパラメタやDBのデータ内容に応じて出力を変える。

ソース

var requestline = require('../libs/requestline');
var mongo = require('../libs/recommend_data');
var EventRelation = mongo.EventRelation;

function sort_items(items){
	var result = new Array();
	// copy
	for (var key in items) {
		var element = {};
		element["event_id"] = key;
		element["genre_id"] = items[key]["genre_id"];
		element["similarity"] = items[key]["similarity"];
		result.push(element);
	}
	// sort
	for (var i = 0; i < items.length-1; i++) {
		for (var j = i+1; j < items.length; j++) {
			if (result[i]["similarity"] < result[j]["similarity"]) {
				var tmp = result[i];
				result[i] = result[j];
				result[j] = tmp;
			}
		}
	}
	return result;
}

exports.index = function(req, res){
	var reqline = new requestline['Requestline'](req.query);
        console.log("Query Parameters");
	console.log(reqline.getParams());

	var items_tmp = {};
	EventRelation.find({timeslot:reqline.getParams()['timeslot']}, function(err, items) {
		for (var i = 0; i < items.length; i++) {
			if (parseInt(items[i]["target_event_id"]) in items_tmp) {
				items_tmp[parseInt(items[i]["target_id"])]["similarity"] += parseFloat(items[i]["distance"]);
			} else {
				items_tmp[parseInt(items[i]["target_id"])] = {};
				items_tmp[parseInt(items[i]["target_id"])]["genre_id"] = parseInt(items[i]["target_genre_id"]);
				items_tmp[parseInt(items[i]["target_id"])]["similarity"] = parseFloat(items[i]["distance"]);
			}
		}

		var result = sort_items(items_tmp);  

		if (reqline.validate()) {
			res.json(result);
		} else {
			res.json({ error : { type : "Qeury Syntax Error", message : "Query Syntax Error"}});
		}
	});
};
これでリクエストラインとかDB内のデータによって出力を変えることが出来た。
次はアイテムベースの協調フィルタリング用のAPIに改修を試みる。
zuqqhi2

某Web系の会社でエンジニアをやっています。 学術的なことに非常に興味があります。 趣味は楽器演奏、ジョギング、読書、料理などなど手広くやっています。