2015-06-16 68 views
3

當我鍵入此進我康壽,它的工作原理:Mongotemplate - 查詢的ObjectId根據大於(GT)或低於(LT)運算符

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")); 

我也試圖與基本的查詢,這樣做,而且還返回一個空數組:

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

我難倒。如何返回數據庫中某個Mongo ObjectID下的所有文檔?

+0

嗯,我可以回答一部分。 ''BasicQuery''接受一個JSON字符串,而你的字符串對於屬性名稱使用單引號或者不加引號,這是不合法的JSON格式。 –

+0

您好,非常感謝您的回覆。我試過BasicQuery query1 = new BasicQuery(「{'_ id':{'$ lt':'ObjectId(\」55732dccf58c555b6d3f1c5a \「)'}})。limit(5).sort({'_ id': - 1}」 )但它並沒有結束工作。所以最終,我只是使用Query對象而不是BasicQuery。 – Simon

+0

這仍然是無效的JSON。以下是使用BasicQuery的有效JSON示例:''BasicQuery query1 = new BasicQuery('{「_ id」:{「$ lt」:「ObjectId(\」55732dccf58c555b6d3f1c5a「)」}}')。limit(5).sort ('{「_id」:-1}');''這是有效的JSON我可以肯定地說,但我不能肯定地說這是否會起作用。 –

回答

4

因此,搜索了一個小時後,我找到了解決方案 - 我必須看看這篇文章,它不在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

此帖是救生員。花了幾個小時尋找這個。我想補充說,上面的答案是「lt」比較,但不顯示排序部分。

我發現當您在mongodb中進行「lt」或「gt」比較時,不能保證您將立即獲得下一個ASC或DESC ObjectId。實際上,我注意到當我收集完畢並做了一個「lt」時,它重置並給了我集合中的第一個文檔(而不是之前的文檔)。對於這一點,我必須添加上述解決方案,我發現這裏: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行,我只是想要個結果,所以我說的限制功能。 第3行:通過添加排序功能,它保證基於當前ObjectId值的立即ASC或DESC ObjectId值。