2016-11-03 4 views
0

/* Я новичок в MongoDB и пытаюсь выяснить, как получить средний correct_answers для курса CSIS2300.Почему мой запрос mongodb ничего не возвращает?

There is a part of the document. Some users take more than one course */ 


     { 
    "_id" : 1.0, 
    "user_id" : "jjackson0", 
    "first_name" : "Jack", 
    "last_name" : "Jackson", 
    "email" : "[email protected]", 
    "status" : "active", 
    "join_date" : "2014-12-10", 
    "last_login_date" : "2016-09-30 23:51:41 -0400", 
    "strengths" : [ 
     "mongo queries", 
     "mongo map-reduce queries" 
    ], 
    "courses" : [ 
     { 
      "code" : "CSIS2300", 
      "total_questions" : 165.0, 
      "correct_answers" : 153.0, 
      "incorect_answers" : 12.0 
     } 
    ] 
} 

/* 2 */ 
{ 
    "_id" : 2.0, 
    "user_id" : "ecoleman1", 
    "first_name" : "Eugene", 
    "last_name" : "Coleman", 
    "email" : "[email protected]", 
    "age" : 49.0, 
    "status" : "banned", 
    "join_date" : "2015-07-01", 
    "last_login_date" : "2016-09-30 23:54:08 -0400", 
    "address" : { 
     "city" : "Chencun", 
     "province" : "PEI" 
    }, 
    "strengths" : [ 
     "visualization", 
     "sql", 
     "query optimisation", 
     "dimensional modelling", 
     "analytics research" 
    ], 
    "courses" : [ 
     { 
      "code" : "CSIS2300", 
      "total_questions" : 188.0, 
      "correct_answers" : 106.0, 
      "incorect_answers" : 82.0 
     }, 
     { 
      "code" : "CSIS3300", 
      "total_questions" : 12.0, 
      "correct_answers" : 9.0, 
      "incorect_answers" : 3.0 
     }, 
     { 
      "code" : "CSIS3380", 
      "total_questions" : 172.0, 
      "correct_answers" : 142.0, 
      "incorect_answers" : 30.0 
     }, 
     { 
      "code" : "CSIS3360", 
      "total_questions" : 140.0, 
      "correct_answers" : 21.0, 
      "incorect_answers" : 119.0 
     }, 
     { 
      "code" : "CSIS4260", 
      "total_questions" : 163.0, 
      "correct_answers" : 75.0, 
      "incorect_answers" : 88.0 
     } 
    ] 
} 

/* 3 */ 
{ 
    "_id" : 3.0, 
    "user_id" : "mbowman2", 
    "first_name" : "Mark", 
    "last_name" : "Bowman", 
    "email" : "[email protected]", 
    "age" : 36.0, 
    "status" : "disabled", 
    "join_date" : "2015-02-01", 
    "last_login_date" : "2016-09-30 23:58:07 -0400", 
    "address" : { 
     "city" : "Ban Kruat", 
     "province" : "NL" 
    }, 
    "strengths" : [ 
     "mongo map-reduce queries", 
     "sql", 
     "dimensional modelling", 
     "visualization" 
    ], 
    "courses" : [ 
     { 
      "code" : "CSIS2300", 
      "total_questions" : 185.0, 
      "correct_answers" : 171.0, 
      "incorect_answers" : 14.0 
     }, 
     { 
      "code" : "CSIS3300", 
      "total_questions" : 57.0, 
      "correct_answers" : 54.0, 
      "incorect_answers" : 3.0 
     } 
    ] 
} 

/* 4 */ 
{ 
    "_id" : 4.0, 
    "user_id" : "acollins3", 
    "first_name" : "Andrew", 
    "last_name" : "Collins", 
    "email" : "[email protected]", 
    "status" : "inactive", 
    "join_date" : "2016-03-06", 
    "last_login_date" : "2016-09-30 23:59:05 -0400", 
    "strengths" : [ 
     "analytics research", 
     "mongo queries", 
     "normalization" 
    ], 
    "courses" : [ 
     { 
      "code" : "CSIS2300", 
      "total_questions" : 101.0, 
      "correct_answers" : 37.0, 
      "incorect_answers" : 64.0 
     } 
    ] 
} 

Есть мой запрос, который ничего не возвращает.

db.assign1.aggregate([ 
      {$project: 
       {_id: 0, 
       course_code: "$courses.code", 
       correctAns: {$max: "$courses.correct_answers"}}}, 
      {$match: {"courses.code": "CSIS2300"}}, 
      {$group: {_id: {"code": "$courses.code"}, Average_CorrectAns: {$avg: "$courses.correct_answers"}}} 

      ]); 
+0

пытаются использовать $ размотать вместо стадии $ проекта – felix

+0

я использовал $ раскручивать на «курсы» и я получил результаты, но я все еще не уверен, правильно ли ответил на вопрос. – Cyrille

+0

Ну только вы можете сказать, так как у нас нет данных ... – felix

ответ

0

Потому что ваш $ проект этап изменения $ courses.code в course_code, так что после этой стадии нет поля с таким именем (то же самое верно и для $ courses.correct_answers). Кроме того, обычно лучше всего $ соответствовать, так как это улучшает производительность вашего запроса. Кроме того, вы можете добавлять этапы в запрос один за другим и запускать его каждый раз, чтобы узнать, какой результат вы получаете после каждого этапа.

Для поиска в среднем нужно $ разматывать курсы массив, окончательный запрос следующим образом:

db.assign1.aggregate([{$unwind: "$courses"}, 
         {$match: {"courses.code": "CSIS2300"}}, 
         {$group: {_id: {"code": "$courses.code"}, correctAns: {$avg: "$courses.correct_answers"}}}, 
         {$project: {course_Code: "$_id.code", correctAns: 1, _id: 0}} 
        ]); 
+0

Я использовал ** course_code ** для ** $ match ** вместо ** $ course.code **. Я работал хорошо, но теперь я получаю _null_ для среднего :( – Cyrille

+0

@Cyrille Приведите пример целого документа в вашем вопросе. –

+0

@Cyrille Или, по крайней мере, измените существующий пример, так что в массивах есть несколько элементов. –

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