我有一个带有Node / MongoDB / Mongoose ODM的Express应用程序。该应用程序显示有关存储在数据库中的项目的数据,并且每个项目页面都应具有指向上一个和下一个项目的链接(该链接也存储在数据库中)。如果该应用程序位于数据库中的最后一个项目,则如何查询数据库中的第一个项目,而不是查找下一个(不存在)?
app.get('/projects/:_id', function(req, res){
var nextProject = Project.find({_id: {$gt: req.params._id}}).sort({_id: 1 }).limit(1)
var prevProject = Project.find({_id: {$lt: req.params._id}}).sort({_id: -1 }).limit(1)
Project.findById(req.params._id, function(err, foundProject){
if(err){
console.log('Error finding project');
console.log(err);
} else {
nextProject.exec(function(err, next){
if(err){
console.log('err');
console.log(err);
} else {
prevProject.exec(function(err, prev){
if(err){
console.log('err');
console.log(err);
} else {
console.log(prev[0].title);
console.log('==============================================');
console.log(foundProject);
console.log('==============================================');
console.log(next[0].title);
res.render('project', {project: foundProject, nextProject: next[0], prevProject: prev[0]});
}
});
}
});
}
});
});
谢谢!
编辑(如果“下一个”返回空,则新代码尝试检索第一个文档...
app.get('/projects/:_id', function(req, res){
Project.find({_id: {$gt: req.params._id}}).sort({_id: 1 }).limit(1), function(err, next){
if(err){
console.log('err getting next project');
console.log(err);
} else if(next){
var nextProject = next
console.log('this is the next project');
console.log(nextProject);
} else {
var nextProject = Project.find().sort({_id: 1 }).limit(1);
console.log('this is the first project');
console.log(nextProject);
}
}
Project.find({_id: {$lt: req.params._id}}).sort({_id: -1 }).limit(1), function(err, prev){
if(err){
console.log('error getting previous project');
console.log(err);
} else if(prev){
var prevProject = prev
console.log('this is the previous project');
console.log('prevProject');
} else {
var prevProject = Project.find().sort({_id: -1}).limit(1);
console.log('this is the last project');
console.log(prevProject);
}
}
Project.findById(req.params._id, function(err, foundProject){
if(err){
console.log('Error finding project');
console.log(err);
} else {
nextProject.exec(function(err, next){
if(err){
console.log('err');
console.log(err);
} else {
prevProject.exec(function(err, prev){
if(err){
console.log('err');
console.log(err);
} else {
console.log(prev[0].title);
console.log('==============================================');
console.log(foundProject);
console.log('==============================================');
console.log(next[0].title);
res.render('project', {project: foundProject, nextProject: next[0], prevProject: prev[0]});
}
});
}
});
}
});
第2次编辑时,出现了更多无法使用的代码:
app.get('/projects/:_id', function(req, res){
var nextProject = Project.find({_id: {$gt: req.params._id}}).sort({_id: 1 }).limit(1)
var prevProject = Project.find({_id: {$lt: req.params._id}}).sort({_id: -1 }).limit(1)
// find the project for the clicked link
Project.findById(req.params._id, function(err, foundProject){
if(err){ // handle any errors
console.log('Error finding project');
console.log(err);
} else {
nextProject.exec(function(err, next){ // if no errors, execute the query object for the next project
if(err){ // handle any errors
console.log('Error getting next project');
console.log(err);
} else if(next){ // if next has a value...
prevProject.exec(function(err, prev){ // ... execute the query object for the previous project
if(err){ // handle any errors
console.log('error getting previous project');
console.log(err);
} else if(prev){ // if previous has a value...
console.log('prev and next have a value');
console.log('============================foundProject============================');
console.log(foundProject);
console.log('============================prevProject============================');
console.log(prev);
console.log('============================nextProject============================');
console.log(next);
res.render('project', {project: foundProject, nextProject: next[0], prevProject: prev[0]});//... render the project page with current project, next project and previous project
} else if(prev){ // if previous doesn't have a value...
var prevProject = Project.find().sort({_id: -1}).limit(1);//... get a query object for the last document in the database
prevProject.exec(function(err, prev){ // execute the query object for the last document
if(err){ // handle any errors
console.log('error getting last document');
console.log(err);
} else { // with no errors...
console.log('next has a value, but previous does not. Gone to last project');
res.render('project', {project: foundProject, nextProject: next[0], prevProject: prev[0]}); // ... render the page
}
})
}
})
} else if(next){ //if next doesn't have a value...
var nextProject = Project.find().sort({_id: 1 }).limit(1);//get a query object for the first document
nextProject.exec(function(err, next){ // execute the query object
if(err){
console.log('error getting first project');
console.log(err);
} else { // with no errors...
console.log('previous has a value, but next does not. Gone to first project');
res.render('project', {project: foundProject, nextProject: next[0], prevProject: prev[0]});//render the page
}
});
}
});
}
}); });
你说 :
链接也存储在数据库中
(1)存储每个项目的链接
在next
和previous
链接可以存储中project
,那么你就不会需要在数据库中获取任何东西显示出来。
确实需要在删除链接的项目时更新项目的链接。但这可能不会经常发生吗?
(2)下一个失败时查找第一个文档
否则,使用您当前的代码,如果nextProject
什么都不返回,则可以执行以下操作:
nextProject = Project.find().sort({_id: 1 }).limit(1).
(3)使用汇总
如果您知道第一个文档的_id,则可以使用aggregate:
$ Project.aggregate([{
$match: {
$or: [{_id: {$gt: req.params._id}},
{_id: lowerId} ] }},
{$sort: {_id: -1}},
{$limit: 1}
])
但是,如果您知道第一个文档,我将改为:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句