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条评论
登录后参与评论

相关文章

来自分类Dev

下一个和上一个总是转到第1页

来自分类Dev

查找数组中值的第一个/下一个位置

来自分类Dev

光滑的滑块转到第一个幻灯片

来自分类Dev

构建后如何启用/禁用Android Studio从跳转到第一个错误

来自分类Dev

使用 less 时如何转到第一个匹配的行

来自分类Dev

滚动到最后一个div的顶部后转到第一个div

来自分类Dev

在vim中的第一个“>”和下一个“<”之间查找和替换

来自分类Dev

查找系列中的下一个HTML文档

来自分类Dev

使按钮转到第二个选项卡式场景,而不是第一个?

来自分类常见问题

mongodb-在聚合框架中查找上一个和下一个文档

来自分类Dev

在MongoDB中排序后如何查找上一个/下一个文档

来自分类Dev

mongodb-在聚合框架中查找上一个和下一个文档

来自分类Dev

Java获取下一个Enum值或从第一个开始

来自分类Dev

将下一个值移动到第一个空行熊猫

来自分类Dev

如何使用r中“下一个”组的第一个值?

来自分类Dev

如何只影响第一个下一个特定的div

来自分类Dev

删除实体的第一个请求比下一个更长

来自分类Dev

查找下一个div

来自分类Dev

查找下一个功能

来自分类Dev

崇高文字-使用键盘快捷键跳转到第一个搜索结果

来自分类Dev

SSH到文件和运行命令中的多个主机失败-仅转到第一个主机

来自分类Dev

MongoDB-上一个和下一个内部子文档

来自分类Dev

mongodb - 查找匹配查询的第一个子文档

来自分类Dev

查找出现次数,然后从第一个结果中的细分中查找下一个出现次数

来自分类Dev

承诺:转到下一个错误功能

来自分类Dev

转到TabControl wpf的下一个选项

来自分类Dev

宏不会转到下一个WS

来自分类Dev

如何跳过if语句转到下一个if语句

来自分类Dev

摩卡,超时后转到下一个文件

Related 相关文章

  1. 1

    下一个和上一个总是转到第1页

  2. 2

    查找数组中值的第一个/下一个位置

  3. 3

    光滑的滑块转到第一个幻灯片

  4. 4

    构建后如何启用/禁用Android Studio从跳转到第一个错误

  5. 5

    使用 less 时如何转到第一个匹配的行

  6. 6

    滚动到最后一个div的顶部后转到第一个div

  7. 7

    在vim中的第一个“>”和下一个“<”之间查找和替换

  8. 8

    查找系列中的下一个HTML文档

  9. 9

    使按钮转到第二个选项卡式场景,而不是第一个?

  10. 10

    mongodb-在聚合框架中查找上一个和下一个文档

  11. 11

    在MongoDB中排序后如何查找上一个/下一个文档

  12. 12

    mongodb-在聚合框架中查找上一个和下一个文档

  13. 13

    Java获取下一个Enum值或从第一个开始

  14. 14

    将下一个值移动到第一个空行熊猫

  15. 15

    如何使用r中“下一个”组的第一个值?

  16. 16

    如何只影响第一个下一个特定的div

  17. 17

    删除实体的第一个请求比下一个更长

  18. 18

    查找下一个div

  19. 19

    查找下一个功能

  20. 20

    崇高文字-使用键盘快捷键跳转到第一个搜索结果

  21. 21

    SSH到文件和运行命令中的多个主机失败-仅转到第一个主机

  22. 22

    MongoDB-上一个和下一个内部子文档

  23. 23

    mongodb - 查找匹配查询的第一个子文档

  24. 24

    查找出现次数,然后从第一个结果中的细分中查找下一个出现次数

  25. 25

    承诺:转到下一个错误功能

  26. 26

    转到TabControl wpf的下一个选项

  27. 27

    宏不会转到下一个WS

  28. 28

    如何跳过if语句转到下一个if语句

  29. 29

    摩卡,超时后转到下一个文件

热门标签

归档