Skip to content
techird edited this page Apr 6, 2016 · 1 revision

Step7. 添加搜索历史记录

上一步:Step6. 添加分页支持和搜索到列表上

本步骤完整源码在 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 字段来记录搜索的次数,这个是一个很简单又很常用的统计手段。

下一步:Step8. 支持文件及元数据删除

Clone this wiki locally