Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Χαίρεται, δουλεύω σε ένα 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 δε βοήθησε και πάρα πολύ :/ 

Δημοσ.

Θα σου πρότεινα να τρέξεις κανα native query.me to BasicQuery όπου απλά του περνάς τo JSON string μέσα. Είναι ωραίο το Spring Data αλλά πολλές φορές πρέπει να λερωθούμε και λίγο.

  • Like 1
Δημοσ.

Γενικά μπορείς να παίξεις με 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..

Μπορεί να κάνω και λάθος, πες άμα ξερεις κάτι..

Δημοσ.

Γενικά μπορείς να παίξεις με 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 έτσι ώστε να το πετύχεις

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...