Мой запрос на агрегирование 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
Похожие вопросы
Новые вопросы
spring
Spring Framework - это среда с открытым исходным кодом для разработки приложений на платформе Java. В ее основе лежит широкая поддержка компонентно-ориентированных архитектур, и в настоящее время в ней имеется более двадцати высокоинтегрированных модулей.