Использование оператора $cond с Spring-data-mongodb [дубликат]
-
21-12-2019 - |
Вопрос
Я хочу собрать воедино следующие данные
{
"user": "user1",
"error": true
}
{
"user": "user2",
"error": false
}
{
"user": "user1",
"error": false
}
В
{
"_id": "user1",
"errorCount": 1,
"totalCount": 2
},
{
"_id": "user2",
"errorCount": 0,
"totalCount": 1
}
С помощью оператора $cond это может быть достигнуто с помощью:
$group: {
_id: "$user",
errorCount : { "$sum" : {"$cond" : ["$error", 1, 0]}},
totalCount : { "$sum" : 1 }
}
Однако, поскольку я использую Spring-data-mongodb, который еще не поддерживает $cond (начиная с версии 1.3.4), я не смог этого сделать.
Есть ли способ выполнить такую же агрегацию без $cond?
Решение
Вы не связаны с этим, даже если в весенних данных нет «функционального интерфейса».(Кстати, поднимите джейру)
Просто получить нативную форму и используйте типы BasicDBObject в трубопроводе.Так что в принципе:
DBCollection myCollection = mongoOperation.getCollection("collection");
<result cast> = myCollection.aggregate(<pipeline here>);
.
Весенние данные дают вам абстракции, но это
Другие советы
Благодаря мнению Нила Ленна, мне удалось получить $ COND для использования поддержки агрегации от Spril-Data.Для этого вы должны реализовать интерфейс агрегации, чтобы взять DBObject.
public class DBObjectAggregationOperation implements AggregationOperation {
private DBObject operation;
public DBObjectAggregationOperation (DBObject operation) {
this.operation = operation;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}
.
Тогда вы сможете использовать его в типоре, обычно:
DBObject operation = (DBObject)JSON.parse ("your pipleline here...");
TypedAggregation<UserStats> aggregation = newAggregation(User.class,
new DBObjectAggregationOperation(operation)
);
AggregationResults<UserStats> result = mongoTemplate.aggregate(aggregation, UserStats.class);
.
Этот подход позволит вам использовать любой оператор агрегации, еще не определенный в рамках.Тем не менее, он также обошел валидацию, установленную в Spring-Data и следует использовать с осторожностью.
Пожалуйста, проголосуйте, если вы хотите, если вы хотите иметь оператор $ COND правильно, поддерживаемый в рамках: https://jira.springsource.org/browse/ Datamongo-861