Вопрос

Я хочу собрать воедино следующие данные

{
   "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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top