我有一个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
})
}
}
})
})
答案 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);
})
})
})