2016-11-21 16 views
0

2つのフィールドの文字列の連結が、指定された値よりも大きいという条件に対して照会したいのですが、以下のようなものですが、 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"、新しいObjectId( "5832499d63594c3b24030c19"))です。新しいBasicDBObject( "_ id"、新しいObjectId( "5832499d63594c3b24030c19"))););} – Tom

+0

うん、実際には私はそうすべきだと思う: '.append(" _ id "、new BasicDBObject(" $ gt "... ' – marmor

関連する問題