Mongotemplate - 根据大于(gt)或小于(lt)运算符查询ObjectId

时间:2015-06-16 16:56:06

标签: mongodb spring-data objectid

当我在我的consol中键入它时,它可以工作:

db.posts.find({"_id": {$lt:ObjectId("55732dccf58c555b6d3f1c5a")}}).limit(5).sort({"_id":-1})

当我使用mongotemplate时,它不起作用并返回一个空白数组:

  @RequestMapping(value="/next", method=RequestMethod.GET)
  public List getNextPost(@RequestParam String next) {
      Query query = new Query();
      query.addCriteria(Criteria.where("_id").lt("55732dccf58c555b6d3f1c5a"));
      List<Posts> posts = template.find(query, Posts.class);
      return posts;

  }

我尝试使用此查询,但它只能返回与id相关的特定条目:

query.addCriteria(Criteria.where("_id").is("55732dccf58c555b6d3f1c5a"));

我也尝试使用Basic Query并执行此操作,它还返回一个空白数组:

BasicQuery query1 = new BasicQuery("{'_id': {$lt:'ObjectId(\"55732dccf58c555b6d3f1c5a\")'}}).limit(5).sort({'_id':-1}");

我很难过。如何返回数据库中某个Mongo ObjectID下面的所有文档?

2 个答案:

答案 0 :(得分:10)

所以在搜索了一个小时之后,我找到了解决方案 - 我不得不看看这篇不在java但在node.js中的帖子。

Querying a MongoDB based on Mongo ID in a node.js app

值得庆幸的是,语言接近于java,所以我看到你只能通过将objectID插入到lt运算符中来查询。您必须创建一个objectID对象并将其插入到运算符中。

      ObjectId objID = new ObjectId("55732dccf58c555b6d3f1c5a");
      query.addCriteria(Criteria.where("_id").lt(objID));

答案 1 :(得分:3)

这篇文章是一个救生员。花了几个小时搜索这个。我想补充一点,上面的答案是&#34; lt&#34;比较,但没有显示排序部分。

我发现当你做一个&#34; lt&#34;或&#34; gt&#34;在mongodb中进行比较,不保证您将立即得到下一个ASC或DESC ObjectId。事实上,我注意到当我到达我的收藏结束并做了一个&#34; lt&#34;时,它重置并给了我收藏中的第一个文件(而不是之前的文件)。为此,我必须添加上面的解决方案:http://www.mkyong.com/mongodb/spring-data-mongodb-query-document/

Query nextStoryQuery = new Query(); //1
previousStoryQuery.addCriteria(Criteria.where("_id").lt(objID)).limit(1); //2
previousStoryQuery.with(new Sort(Sort.Direction.DESC, "_id")); //3

注意,在第2行,我只是寻找1个结果,所以我添加了限制功能。 第3行:通过添加Sort功能,它可以保证基于当前ObjectId值的即时ASC或DESC ObjectId值。