2016-11-21 49 views
0

我想查詢兩個字段的字符串連接大於給定值的情況,如下所示,但我不知道如何寫queryCondition。有人可以幫忙嗎?如何使用Java客戶端查詢mongoDB中的多個字段

long t = 1479690653366; 
String id = "5832499d63594c3b24030c19"; 

//There are _id and time fields in the document 
DBCollection collection = ... 
collection.find(<queryCondition>); 

The logic of <queryCondition> is to find the documents whose concatenation of _time and _id column is larger than the concatenation of time and id, that is 14796906533665832499d63594c3b24030c19 
+0

你能解釋一下這個查詢的需要?有可能是一個更合適的方式來完成你想要的 – marmor

+0

謝謝@marmor。基本上,我想要的是查找排序限制。我想查詢時間戳字段,但在我的情況下有很多具有相同時間戳值的文檔(例如,10k +)。所以,我想結合時間戳字段和_id字段,並使用collection.query僅查找我沒有獲取的文檔(我將檢查點最大的時間戳和我已處理的_id) – Tom

回答

1

我不認爲你需要在這裏串連接。

你想要文檔有_time > 1479690653366,以及文檔有_time == 1479690653366,但只有他們的_id > 5832499d63594c3b24030c19

在這種情況下,你可以查詢:

collection.find({ $or : [ 
    _time : { $gt : 1479690653366}, 
    { _time : "1479690653366", _id : { $gt : ObjectId("5832499d63594c3b24030c19") } } 
]}); 

還是在Java語法,是這樣的:

DBObject or_part1 = new BasicDBObject("_time", new BasicDBObject("$gt", 1479690653366)); 
DBObject or_part2 = new BasicDBObject("_time", 1479690653366).append("_id", new BasicDBObject("$gt", new ObjectId("5832499d63594c3b24030c19"))); 
BasicDBList or = new BasicDBList(); 
or.add(or_part1); 
or.add(or_part2); 
DBObject query = new BasicDBObject("$or", or); 
collection.find(query); 
+0

謝謝@marmor,您的答案看起來很有希望,讓我試試,非常感謝! – Tom

+0

謝謝@ marmor,它工作正常。你的代碼中的一件小事是DBObject or_part2 = new BasicDBObject(「_ time」,1479690653366).append(「_ id」,new ObjectId(「5832499d63594c3b24030c19」));應該是DBObject or_part2 = new BasicDBObject(「_ time」,1479690653366).append(「$ gt」,new BasicDBObject(「_ id」,new ObjectId(「5832499d63594c3b24030c19」))); – Tom

+0

是的,其實我認爲它應該是:'.append(「_ id」,新的BasicDBObject(「$ gt」...' – marmor

相關問題