MongoDB查找下一个文档或转到第一个

流浪蛋黄

我有一个带有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)存储每个项目的链接

nextprevious链接可以存储中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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章