首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免循环访问由mongodb和express生成的URL。

避免循环访问由mongodb和express生成的URL。
EN

Stack Overflow用户
提问于 2017-10-18 21:25:50
回答 1查看 19关注 0票数 0

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

目标是向用户显示一个随机文档url,该文档url以前从未被访问过,直到用户看到了集合中的所有文档,然后整个集合将被“清除”,以便再次访问。

我考虑过使用cookie来实现它,但我还没有找到一种方法来实现它。

该应用程序是使用构建的,mongodb使用mongoose模块。

Model.class:

代码语言:javascript
复制
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);

来自路由器的代码片段:

代码语言:javascript
复制
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);

            })
        })

    })

如何查找数据库条目

代码语言:javascript
复制
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
                    })
                }


            }
        })
    })
EN

回答 1

Stack Overflow用户

发布于 2017-10-18 21:45:59

如果您使用顺序循环文档,而不是随机的,则只需将+X添加到当前id中即可。

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

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

代码语言:javascript
复制
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);

            })
        })
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46819516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档