Мой запрос на агрегирование mongo выглядит так:

db.events.aggregate({
    "$match" : { $or : [ 
             {"event_state" : "live"},
             {
                 $and: [
                    {"event_state" : "scheduled"},
                    {"schedule.start_time" : { "$gt" : ISODate("2016-12-15T14:06:00.000Z")}}
                    ]
             }
            ] 
        } }, 
        { "$sort" : { "schedule.start_time" : 1}} , 
        { "$project" : { 
            "registered_users_count" : { "$size" : [ "$registered_users"]} , 
            "event_image" : 1 , "celebrity" : 1 , "name" : 1 , "category" : 1 , 
            "schedule" : 1 , "online_moderator" : 1 , "offline_moderator" : 1 , 
            "region" : 1 , "status" : 1 , "event_state" : 1 , "recorder_id" : 1 , 
            "webcast_url" : 1 , "replay_url" : 1
        }})

Я пробовал что-то вроде ниже

Вариант 1:

matchCondition = Aggregation.match(Criteria.where("event_state")
                    .is("scheduled").and("schedule.end_time").gt(d)
                    .orOperator(Criteria.where("event_state").is("live")));

Вариант 2:

matchCondition = Aggregation.match(Criteria
                    .where("event_state")
                    .is("live")
                    .orOperator(
                            Criteria.where("event_state").is("scheduled")
                                    .and("schedule.end_time").gt(d)));

Условия сортировки и проецирования

sortCondition = Aggregation.sort(Sort.Direction.ASC,
                    "schedule.start_time");

AggregationOperation projectValues = Aggregation.project()
                .and("registered_users").size().as("registered_users_count")
                .and("event_image").as("event_image").and("celebrity")
                .as("celebrity").and("name").as("name").and("category")
                .as("category").and("schedule").as("schedule")
                .and("online_moderator").as("online_moderator")
                .and("offline_moderator").as("offline_moderator").and("region")
                .as("region").and("status").as("status").and("event_state")
                .as("event_state").and("recorder_id").as("recorder_id")
                .and("webcast_url").as("webcast_url").and("replay_url")
                .as("replay_url");

Aggregation aggrigation = Aggregation.newAggregation(matchCondition,
                sortCondition, projectValues);

Ни один из Вариантов 1 и 2 не обеспечивает желаемое состояние. Итак, как этого добиться?

2
Kiran 15 Дек 2016 в 18:24
Попробуй это. OrOperator должен быть первым. Aggregation.match (Criteria.orOperator (Criteria.where ("event_state") .is ("запланировано"). And ("schedule.start_time"). Gt (d), Criteria.where ("event_state"). Is (" жить")))
 – 
Lipu
15 Дек 2016 в 18:31
"Criteria.orOperator" не работает, как указано выше. Потому что после критерия вы можете написать «где» или «класс». Событие, если я попытался написать то же самое. Он показывает мне следующее: «Невозможно создать статическую ссылку на нестатический метод или Оператор (Критерии ...) из типа Критерии».
 – 
Kiran
15 Дек 2016 в 18:38
Простите за это. Используйте 'новый' оператор.Aggregation.match (new Criteria (). OrOperator (criterion1;
 – 
Lipu
15 Дек 2016 в 18:42
Большое спасибо @Lipu. Пожалуйста, укажите свое предложение в качестве ответа. Так что я могу это принять.
 – 
Kiran
15 Дек 2016 в 18:54

1 ответ

Лучший ответ

Сформируйте файл spring-data-mongo Документация по API Criteria.OrOperators принимают несколько критериев в качестве аргумента для формирования операции или типа. Таким образом, решение для этого будет следующим:

Aggregation.match(
    new Criteria().orOperator(
        Criteria.where("event_‌​state").is("scheduled").and("schedule.start_time").gt(d),
        Criteria.where("event_state").is("live")
    )
)
13
Lipu 19 Авг 2022 в 15:46