-
Notifications
You must be signed in to change notification settings - Fork 1
Step7
techird edited this page Apr 6, 2016
·
1 revision
本步骤完整源码在 workflow/step-7 分支上,提交记录为
6b80ff7
保存搜索记录,我们可以使用另一个 MongoDB Collection。在确定请求有关键字的时候,我们去更新关键字 Collection。
// handle/list.js
// use the keywords collection
const keywordCollection = db.collection('keywords');
if (keyword) {
const search = new RegExp(keyword);
criteria.$or = ['name', 'meta.author', 'meta.labels', 'meta.alt'].map(field => ({ [field]: search }));
// add to search history
const history = keywordCollection.find({ keyword });
const found = yield history.next();
// update count or insert
if (found) {
const count = found.count + 1;
keywordCollection.findOneAndUpdate({ keyword }, { $set: { keyword, count, last: new Date() } });
} else {
keywordCollection.insert({ keyword, count: 1, last: new Date() });
}
}更新 keywords Collection 的时候,我们会先查询数据库里是否有关于这个关键字的记录,如果有,我们把访问次数加一,否则,插入访问记录。
现在,kewords Collection 已经有我们关键字的记录了,我们添加一个新的路由来支持用户读取。
// server.js
app.use("/keyword", require("./handle/keyword");创建 handle/keyword.js 来实现它:
// handle/keyword.js
'use strict';
const async = require("co");
const printer = require("../lib/printer");
const mongo = require("../lib/mongo");
const keywordHisory = (request, response) => async (function * () {
const print = printer(request, response);
const params = request.query;
let db;
try {
db = yield mongo.connect();
} catch (mongoError) {
print(mongoError);
return;
}
try {
const keywords = db.collection('keywords');
const history = yield keywords.find().toArray();
print({ history });
db.close();
} catch (error) {
console.error(error);
console.log(error.stack);
print({ error });
} finally {
db.close();
}
});
module.exports = keywordHisory;代码很简单,在此不再赘述。

keyword记录使用了一个count字段来记录搜索的次数,这个是一个很简单又很常用的统计手段。