避免循环访问由mongodb生成的访问过的网址并表达

时间:2017-10-18 21:25:51

标签: javascript node.js mongodb express cookies

我有一个mongodb集合,其中每个文档都可以通过特定的URL访问。

目标是向用户显示一个随机文档URL,之前没有访问过,直到用户看到集合中的所有文档,然后整个集合将被“清除”,以便再次访问。 / p>

我已经考虑过使用cookies来实现它,但我还没有办法实现它。

使用express for nodejs构建应用程序,使用mongob的mongoose模块。

Model.class:

var mongoose = require('mongoose'),
    URLSlugs = require('mongoose-url-slugs'),
    AutoIncrement = require('mongoose-sequence')(mongoose),
    Schema = mongoose.Schema;


var dilemmaSchema = new Schema({
    dilemma_title: String,
    red_dilemma: String,
    blue_dilemma: String,
    red_dilemma_votes: {
        type: Number,
        default: 0
    },
    blue_dilemma_votes: {
        type: Number,
        default: 0
    }
});


dilemmaSchema.plugin(AutoIncrement, {
    inc_field: 'id'
});
dilemmaSchema.plugin(URLSlugs('dilemma_title'));

module.exports = mongoose.model('Dilemma', dilemmaSchema);

路由器的代码段:

dilemmaRouter.route('/next')
    .get(function (req, res) {

        Dilemma.count().exec(function (err, count) {
            var random = Math.floor(Math.random() * count);

            Dilemma.findOne().skip(random).exec(function (err, dilemma) { //This function is supposed to redirect to an unvisited URL, and mark it as visited
                dilemmaID = dilemma._id;

                res.redirect('/' + dilemma.id + '/' + dilemma.slug);

            })
        })

    })

如何查找数据库条目

dilemmaRouter.route('/:id/:slug')
    .get(function (req, res) {
        const _id = req.params.id;
        const _slug = req.params.slug;

        let query = {
            id: _id,
            slug: _slug
        }

        Dilemma.findOne(query, function (err, dilemma) {
            if (err) {
                console.log(err);
            } else {
                if (dilemma === null) {
                    res.redirect('/');
                } else {
                    res.render('index', {
                        dilemma: dilemma
                    })
                }


            }
        })
    })

1 个答案:

答案 0 :(得分:1)

如果您使用订单循环处理文档然后不是随机的,则只需将+ X添加到当前ID即可。

如果是随机的,您需要为所有用户存储他们已经看过的所有文档。因此,您需要在数据库中使用另一个“表格”,或者您需要在用户模型中添加一个字段,在该字段中您的商店可以看到所有文档。

“最佳”解决方案现在想的是在您的用户模型中添加此字段(或者能够知道IP X已经看到文档A和B)。当您的用户尝试访问您的页面时,您将获得所有文档的ID列表,删除用户看到的id,并在此列表中随机执行。

dilemmaRouter.route('/next')
    .get(function (req, res) {

        Dilemma.count().exec(function (err, count) {
           // find all documents 
            User.find({'idUserOrIP' : 'userIPorID'}).exec(function(user) {
                var userListSaw = user.listSaw;
            })
            // create a list with all your document id
            var allDocs = [1...100];
            // remove id already seen (user saw id 1 to 3)
            allDocs = [4...100];
            // random now store the index of the id of the document you want to display
            var random = Math.floor(Math.random() * allDocs.length);
             // just find your document with the id you just get
            Dilemma.find({'id' : allDocs[random]}).exec(function (err, dilemma) { //This function is supposed to redirect to an unvisited URL, and mark it as visited
                dilemmaID = dilemma._id;

                res.redirect('/' + dilemma.id + '/' + dilemma.slug);

            })
        })
})