2016-11-21 1 views
0

Ich möchte abfragen gegen eine Bedingung, dass die Zeichenfolge Verkettung von zwei Feldern ist größer als ein gegebener Wert, etwas wie folgt, aber ich weiß nicht, wie zu schreiben die Abfragebedingung. Könnte jemand dabei helfen?Wie Abfrage über mehrere Felder in MongoDB mit dem Java-Client

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

können Sie die Notwendigkeit für diese Abfrage erklären? es könnte eine geeignetere Art und Weise zu erreichen, was Sie wollen – marmor

+0

Dank @marmor. Grundsätzlich, was ich will, ist Sortiergrenze zu finden. Ich möchte gegen Timestamp-Feld abfragen, aber es gibt viele Dokumente mit demselben Timestamp-Wert in meinem Fall (z. B. 10k +). Also, ich möchte das Timestamp-Feld und das _id-Feld kombinieren und mit collection.query nur die Dokumente finden, die ich nicht abgerufen habe (ich überprüfe den größten Zeitstempel und die _id, die ich verarbeitet habe) – Tom

Antwort

1

Ich glaube nicht, dass Sie Zeichenfolge Verkettung hier benötigen.

Sie möchten Dokumente, die _time > 1479690653366 haben, sowie Dokumente, die _time == 1479690653366 haben, aber nur wenn ihre _id > 5832499d63594c3b24030c19.

In diesem Fall können Sie abfragen:

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

Oder in Java Syntax, so etwas wie:

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

Danke @marmor, your Antwort sieht sehr vielversprechend aus, lass es mich versuchen, vielen Dank! – Tom

+0

Danke @ Marmor, es funktioniert gut. eine kleine Sache in Ihrem Code ist, dass DBObject or_part2 = new BasicDBObject ("_ Zeit", 1479690653366) .append ("_ id", neue ObjectId ("5832499d63594c3b24030c19")); sollte DBObject sein oder_part2 = new BasicDBObject ("_ time", 1479690653366) .append ("$ gt", neues BasicDBObject ("_ id", neue ObjectId ("5832499d63594c3b24030c19"))); – Tom

+0

yep, eigentlich denke ich sollte es sein: '.append (" _ id ", neues BasicDBObject (" $ gt "...' – marmor