我有一个mongodb集合,其中每个文档都可以通过一个特定的url访问。
目标是向用户显示一个随机文档url,该文档url以前从未被访问过,直到用户看到了集合中的所有文档,然后整个集合将被“清除”,以便再次访问。
我考虑过使用cookie来实现它,但我还没有找到一种方法来实现它。
该应用程序是使用构建的,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
})
}
}
})
})发布于 2017-10-18 21:45:59
如果您使用顺序循环文档,而不是随机的,则只需将+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);
})
})
})https://stackoverflow.com/questions/46819516
复制相似问题