ALLisCHAOS Δημοσ. 4 Ιουλίου 2016 Δημοσ. 4 Ιουλίου 2016 Χαίρεται, δουλεύω σε ένα project με mongodb και spring data. Έχω το παρακάτω query: Aggregation agg = newAggregation( match(Criteria.where("city").is(city)), unwind("rate"), group("id").first("name").as("name").avg("rate.general_rate").as("rate").count().as("num_rates"), project("rate","name").and("_id").previousOperation().andExpression("rate * num_rates * dynamic_value").as("popularity"), sort(Sort.Direction.DESC, "popularity") ); Aλλά θελω η μεταβλητη dynamic_value μέσα στην andExpression να ενημερώνεται μέσα απο ένα if statement πχ: if(rate < 2) dynamic_value = 1; else if(rate < 3) dynamic_value = 2 κτλ κτλ Το θέμα είναι ότι ενώ στη Mongodb υπάρχει ο τελεστής $cond γι αυτή τη δουλειά στo spring data δεν έχει υπάρξει ακόμη η υλοποίηση. Γνωρίζει κανείς πως μπορώ να πετύχω αυτό το αποτέλεσμα?Το google δε βοήθησε και πάρα πολύ :/
ZAKKWYLDE Δημοσ. 4 Ιουλίου 2016 Δημοσ. 4 Ιουλίου 2016 Θα σου πρότεινα να τρέξεις κανα native query.me to BasicQuery όπου απλά του περνάς τo JSON string μέσα. Είναι ωραίο το Spring Data αλλά πολλές φορές πρέπει να λερωθούμε και λίγο. 1
chaos686 Δημοσ. 4 Ιουλίου 2016 Δημοσ. 4 Ιουλίου 2016 Γενικά μπορείς να παίξεις με DBObject π.χ: DBObject command = new BasicDBObject(); command.put("rate", BasicDBObject("$cond", new Object[]{ new BasicDBObject("$lte", new Object[]{ "$rate", 2 }), 1, // if true 2 // if false } }); AggregationOperation operation = new CustomProjectAggregationOperation( new BasicDBObject("$project", command)); public class CustomProjectAggregationOperation implements AggregationOperation { private DBObject operation; public CustomProjectAggregationOperation (DBObject operation) { this.operation = operation; } @Override public DBObject toDBObject(AggregationOperationContext context) { return context.getMappedObject(operation); } } Αλλά δεν νομίζω ότι μπορείς να κάνεις 'else if' στη mongo.. Μπορεί να κάνω και λάθος, πες άμα ξερεις κάτι..
ALLisCHAOS Δημοσ. 5 Ιουλίου 2016 Μέλος Δημοσ. 5 Ιουλίου 2016 Γενικά μπορείς να παίξεις με DBObject π.χ: DBObject command = new BasicDBObject(); command.put("rate", BasicDBObject("$cond", new Object[]{ new BasicDBObject("$lte", new Object[]{ "$rate", 2 }), 1, // if true 2 // if false } }); AggregationOperation operation = new CustomProjectAggregationOperation( new BasicDBObject("$project", command)); public class CustomProjectAggregationOperation implements AggregationOperation { private DBObject operation; public CustomProjectAggregationOperation (DBObject operation) { this.operation = operation; } @Override public DBObject toDBObject(AggregationOperationContext context) { return context.getMappedObject(operation); } } Αλλά δεν νομίζω ότι μπορείς να κάνεις 'else if' στη mongo.. Μπορεί να κάνω και λάθος, πες άμα ξερεις κάτι.. Η αληθεια είναι οτι κ στο google πανω στο DBObject έπεσα απλά δε μπόρεσα να συντάξω το query μου σωστά, όσο για το else if εχεις δίκαιο δεν υποστηρίζεται, ένας τύπος έδινε σαν λύση στο else να βάζεις καινούργιο condition έτσι ώστε να το πετύχεις
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα