2017-05-10 2 views
0

Ich arbeite an einem Projekt, wo ich Federdaten mongodb verwenden. Ich erstelle eine Mongo Abfrage wie folgt:Wie mongodb aggregierte Funktionen in Kriterien zu verwenden?

Query query = new Query(); 

Criteria one = Criteria.where(DB_FIELD_1).gt(1); 
Criteria two = Criteria.where(DB_FIELD_2).lt(10); 

Criteria final = new Criteria().andOperator(one,two); 
query.addCriteria(final); 

// after making the query, I am executing it using mongoTemplate 

Nun, ich habe ein Datumsfeld mit Format YYYYMMDD. Ich möchte prüfen, ob der Monat = aktueller Monat ist. Wenn das Feld z. B. "20170501" lautet, ist der Monat des Datums (05) der aktuelle Monat (5. Mai). Wie extrahiere ich den Monatswert aus dem Datum und überprüfe diese Logik zusammen mit anderen Kriterien (eins und zwei)? Ich weiß, dass es $ Monat gibt, um den Monatswert vom Datum zu extrahieren. Aber ich weiß nicht, wie man die Aggregatfunktion in die Klasse "Criteria" einbindet. Mein Endergebnis sollte in etwa so aussehen:

Criteria final = new Criteria().andOperator(one,two,criteria to check month = current month); 
query.addCriteria(final); 
+0

Datumsfeld als String in DB gespeichert ist? – pvpkiran

+0

wird als Datum gespeichert – user3528213

+0

Können Sie ein Beispieldokument aus Ihrer Sammlung zum Beitrag hinzufügen? und was ist deine spring mongo db version? Sie müssen für diesen einen Projektionsausdruck verwenden. – Veeram

Antwort

1

Sie können unten Aggregationspipeline mit der aktuellen Feder db Version 1.10.2/Spring 1.5.2 Boot verwenden. Fügen Sie die anderen Felder in die $project ein, die Sie ausgeben möchten.

Verwenden Sie $addFields anstelle von für 3.4 x Mongo Server-Version.

AggregationOperation project = Aggregation.project().and(DateOperators.dateOf(DB_FIELD_1).month()).as("field1").and(DateOperators.dateOf(DB_FIELD_2).month()).as("field2"); 
AggregationOperation match = Aggregation.match(Criteria.where("field1").gt(1) 
       .and("field2").lt(10)); 
Aggregation aggregation = Aggregation.newAggregation(project, match); 
List<BasicDBObject> results = mongoTemplate.aggregate(aggregation, collectionname, BasicDBObject.class).getMappedResults(); 

Verwenden 1.4.1 Version

AggregationOperation project = Aggregation.project().and(DB_FIELD_1).extractMonth().as("field1").and(DB_FIELD_2).extractMonth().as("field2"); 
+0

Was ist Projekt() in der ersten Zeile? – user3528213

+0

Es tut uns leid, es ist die '$ project' Bühne zu erstellen. Verwenden Sie 'Aggregation.project()'. Aktualisierte Antwort – Veeram

+0

und auch DateOperators. Ich kann diese Klasse nicht finden – user3528213

Verwandte Themen