2016-05-24 1 views
1

я должен следующие данные Db:Монго: как считать нескольких массивов в одной агрегации с помощью mongoTemplate Java-

{user : Tom, CORRECT: {q1, q3}, WRONG : {q2, q4} }, 
{user : jim, CORRECT: {q1}, WRONG : {q2, q3, q4} }, 
{user : Tom, CORRECT: {q6}, WRONG : {7} }, 

Я хотел бы использовать агрегацию, чтобы получить количество каждого ПРАВИЛЬНОГО \ Неправильные каждого пользователя, т.е.

{user : Tom, correctCount : 3, wrongCount : 3}, 
{user : jim, correctCount : 1, wrongCount : 3}, 

То, что я попытался это:

Aggregation agg = newAggregation(
      group("name"). 
        addToSet(correct).as(correct). 
        addToSet(wrong).as(wrong). 
        addToSet(partial).as(partial) 
    ); 

Но для каждого пользователя я получаю полный список данных (то есть q1, q2, q3 ...), я всегда могу сделать size() в этом списке, но он неэффективен. как я могу получить значение count вместо этого?

Благодаря

ответ

0

Один из способов вы можете идти об этом, чтобы создать дополнительное поле, которое имеет размер этих массивов с помощью $size оператора на этапе трубопровода $project, а затем группировать документы в $group трубопровода, чтобы получить накопленную сумму, как рассчитывает на новом поле размер:

Монго оболочки:

db.collection.aggregate([ 
    { 
     "$project": { 
      "user": 1, 
      "correctSize": { "$size": "$CORRECT" }, 
      "wrongSize": { "$size": "$WRONG" } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$user", 
      "correctCount": { "$sum": "$correctSize" }, 
      "wrongCount": { "$sum": "$wrongSize" } 
     } 
    } 
]) 

Java: использование SpEL andExpression на стадии проекта, чтобы использовать $size expression

import static org.springframework.data.mongodb.core.aggregation.Expressions.*; //new 
... 
Aggregation agg = newAggregation(
    project("user") 
     .andExpression(expression("size", field("CORRECT"))).as("correctSize"); 
     .andExpression(expression("size", field("WRONG"))).as("wrongSize"); 
    group("user") 
     .sum("correctSize").as("correctCount") 
     .sum("wrongSize").as("wrongCount") 
); 

 Смежные вопросы

  • Нет связанных вопросов^_^