Я новичок в MongoDB, поэтому, пожалуйста, сотрудничайте, если я спрошу какую-нибудь глупость. пожалуйста, обратитесь к таблице ниже

status:"Failure"
key:object
   accountID:"AKRRTTY"

Может ли кто-нибудь сказать мне, как я могу найти счетчики статуса в соответствии с acountID (который является подобъектом ключа)?

Статусы могут быть разных типов: например Processed, Blocked и т. д.

0
Rishabh Bansal 8 Окт 2018 в 14:46

2 ответа

Лучший ответ

Вы должны использовать агрегирование, чтобы получить счет для всех статусов за один раз.

Вам нужно будет настроить выходной pojo для учета запроса агрегирования. В идеале ваше pojo должно содержать два поля: одно для статуса (_id) и одно для count (count).

Что-то вроде

AggregationOperation match = Aggregation.match(Criteria.where("key.carrier").is(carrierId));
AggregationOperation group = Aggregation.group("status").count().as("count");
AggregationOperation project = Aggregation.project("count").andExclude("_id").andInclude(Fields.from(Fields.field("status", "_id")));


Aggregation agg = Aggregation.newAggregation(match,group,project);

List<YourPojo> results = mongoTemplate.aggregate(agg, colname, YourPojo.class).getMappedResult();
1
Sagar Veeram 9 Окт 2018 в 04:27

Вы можете комбинировать $match и $group для того, чего хотите достичь. Операция сопоставления будет фильтровать по accountID, где группа объединит результаты в поле состояния и подсчитает количество совпадений с аккумулятором.

Форматирование двух запросов будет таким:

Соответствующий запрос:

{'$match': {
   'key.accountID': '<<account_id>>'
   }
}

Групповой запрос:

{'$group': {
   '_id': '$status', 
   'count': {'$sum': 1}
   }
}

В java это можно сделать так:

Arrays.asList(
  match(eq("key.accountID", "test")), 
  group("$status", sum("count", 1L))
)

Постскриптум java потребуется следующий импорт:

import java.util.Arrays;
import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Aggregates.group;
import static com.mongodb.client.model.Aggregates.match;
import static com.mongodb.client.model.Accumulators.sum;
0
Sven Hakvoort 8 Окт 2018 в 14:15