Использование $ cond в агрегированном проекте Spring Data эквивалентно [duplicate]

Конечно, есть много таких подходов, как синхронный запрос, обещание, но из моего опыта я думаю, что вы должны использовать подход обратного вызова. Естественно, что асинхронное поведение Javascript. Итак, ваш фрагмент кода можно переписать немного иначе:

function foo() {
    var result;

    $.ajax({
        url: '...',
        success: function(response) {
            myCallback(response);
        }
    });

    return result;
}

function myCallback(response) {
    // Does something.
}
8
задан chridam 21 March 2015 в 19:43
поделиться

2 ответа

Я добавляю ту же проблему и искал в Google, и это был первый результат, который я нашел, поэтому я хотел бы добавить для будущих читателей, что эта функция теперь доступна с версии 1.10 RC1 с классом ConditionalOperators.Cond.

Здесь вы можете прочитать JavaDoc здесь .

0
ответ дан Aurasphere 24 August 2018 в 21:07
поделиться

Если вы используете текущую версию Spring Data, которая поддерживает оператор $cond по конвейеру $project, то это может быть преобразовано в (untested):

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.ConditionalOperators.Cond.*;
import org.springframework.data.mongodb.core.query.Criteria;

Cond condOperation = ConditionalOperators.when(Criteria.where("start").is("EARLY"))
                                    .thenValueOf("deltastart.start")
                                    .otherwise("deltastart.end");

Aggregation agg = newAggregation(project().and(condOperation).as("start"));
AggregationResults<MyClass> results = mongoTemplate.aggregate(agg, MyClass.class); 
List<MyClass> myList = results.getMappedResults();

Для версии Spring-Data MongoDB, которая не поддерживает оператор $cond в операции агрегации, существует обходное решение, которое заключается в реализации AggregationOperation , чтобы взять DBObject:

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);
    }
}

Затем реализовать операцию $project как DBObject в конвейере агрегации, который совпадает с тем, который у вас есть:

DBObject operation = (DBObject) new BasicDBObject(
    "$project", new BasicDBObject(
         "start", new BasicDBObject(
                "$cond", new Object[]{
                        new BasicDBObject(
                            "$eq", new Object[]{ "$start", "EARLY"}
                        ),
                        "$deltastart.start",
                        "$deltastart.end"
                 }
           )
     )
);

, который затем можно использовать в TypeAggregation:

TypedAggregation<CustomClass> aggregation = newAggregation(CustomClass.class,
    new CustomProjectAggregationOperation(operation)
);
AggregationResults<CustomClass> result = mongoTemplate.aggregate(aggregation, CustomClass.class); 
6
ответ дан chridam 24 August 2018 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: