2017-10-18 45 views
0

我有一個mongodb集合,其中每個文檔都可以通過特定的URL進行訪問。避免循環訪問由mongodb和express生成的URL

我們的目標是向用戶顯示一個隨機的文檔url,直到用戶看到集合中的所有文檔,然後整個集合將被「清除」以便再次訪問。

我曾考慮過使用cookie來實現它,但我還沒有找到辦法做到這一點。

該應用程序使用express for nodejs和mongodb的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

如果您通過訂單循環瀏覽文檔,然後不是隨機的,則只需將+ 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); 

      }) 
     }) 
}) 
+0

目前我還沒有任何用戶模型,因爲它主要是訪問我的網站的客人。但是,如果我要做一個,我怎麼能抓住一個用戶的IP地址,並讓用戶退出?另外,你不覺得這可以通過某種方式使用cookie嗎?對我來說,它似乎是最好的選擇(如果可能的話)。 順便說一句,我更新了我的帖子,如何生成數據庫條目的網址代碼片段。 –

+0

關於ip,你可以從'req'中訪問它。但你也可以使用cookies,它會工作 – sheplu

+0

哦,很高興知道。你有一個想法,我怎麼可以去用cookies來做呢?有沒有可能創建網址特定的cookie?所以我例如可以設置所有已訪問的頁面的cookie ='visited'。 –