Как игнорировать этап агрегации в зависимости от условия? - PullRequest
0 голосов
/ 19 сентября 2019

Я работаю над извлечением данных из MongoDB, используя его драйвер Java.Я пытаюсь добавить данные фильтра в мой запрос, когда он не только нулевой.Если в то время данные фильтров имеют нулевое значение, они возвращают нулевые значения, поскольку не могут найти данные, удовлетворяющие запросу, поскольку фильтры являются нулевыми.Но концепция состоит в том, чтобы исключить эту фильтрацию данных и перейти к остальным, где такие условия, как BELONGS_TO_OWNER_DSID, IS_DELETED only.

Я пытался использовать match(ne(filter, null)), но он показывает ошибку компиляции.

List<Bson> filters = new ArrayList<Bson>();
if (valueOfMonth != 0) {
    filters.add(gt(TECHNOLOGY_VERSION_EOL_KEY, LocalDate.now()));
    filters.add(lt(TECHNOLOGY_VERSION_EOL_KEY, getFutureDate(valueOfMonth)));
}
Map<String, Object> multiIdMap = new HashMap<String, Object>();
multiIdMap.put(APPLICATION, "$application");
multiIdMap.put(TECHNOLOGY, "$technology");

@SuppressWarnings({ "rawtypes", "unchecked" })
AggregateIterable<Document> result = technologiesCollection.aggregate(
        Arrays.asList(
            match(eq(BELONGS_TO_OWNER_DSID, dsId)), 
            match(eq(IS_DELETED, false)),
            match(and(filters)),
            project(Projections.include(TECHNOLOGY, APPLICATION)), 
            group(multiIdMap, Accumulators.sum("count", 1)),
            sort(eq("count", 1)), 
            addFields(new Field("data", "$_id")), 
            project(eq("_id", 0))), 
        Document.class);

Ожидаемый результат, если valueOfMonth=0, то я не хочу, чтобы эти данные фильтра были в запросе where, а использовали только остальные поля, такие как BELONGS_TO_OWNER_DSID, IS_DELETED, и выдали бы весь результат.

Данные фильтрации должны фильтроваться только в том случае, если valueOfMonth больше нуля, но если оно равно нулю, возвращаются все значения, которые соответствуют только BELONGS_TO_OWNER_DSID, IS_DELETED, без valueOfMonth.

Код работает, как и ожидалось, если я дам valueOfMonth>0.Однако с 0 он вернет ноль, поскольку не может найти данные, удовлетворяющие запросу.

1 Ответ

0 голосов
/ 19 сентября 2019

Как насчет следующих действий:

List<Document> aggregationList = new ArrayList()<>;
aggregationList.add(match(eq(BELONGS_TO_OWNER_DSID, dsId)));
aggregationList.add(match(eq(IS_DELETED, false)));
if (valueOfMonth != 0) {
    List<Bson> filters = new ArrayList<Bson>();
    filters.add(gt(TECHNOLOGY_VERSION_EOL_KEY, LocalDate.now()));
    filters.add(lt(TECHNOLOGY_VERSION_EOL_KEY, getFutureDate(valueOfMonth)));
    aggregationList.add(match(and(filters)));
}

aggregationList.add(project(Projections.include(TECHNOLOGY, APPLICATION)));
// add other stages...

AggregateIterable<Document> result = coll.aggregate(aggregationList, Document.class);

, когда valueOfMonth == 0, в вашем списке агрегации вообще не будет match(and(filters)).Таким образом, нет необходимости пытаться использовать драйвер MongoDB для отключения логики filters, в этом случае он будет просто проигнорирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...