2014-11-24 2 views
2
  • во-первых, комментарий. Описанная коллекция упрощена для этого вопроса. Мне интересно понять, как манипулировать mongo db и получать статистику моих данных.

Предположим, у меня есть коллекция с результатами испытаний. Схема является:Статистика сбора/обработки запросов Mongoose

Results { 
    _id: ObjectId 
    TestNumber: int 
    result: String  // this contains "pass" or "fail" 

    // additional data 
} 

Для каждого теста может быть много сообщений, поэтому, скорее всего, каждый TestNumber появляется более чем в одном документе.

Как я могу выполнить запрос, который возвращает эту информацию на всей коллекции:

TestNumber | count of result == "pass" | count of result == "fail" 

ответ

1

Вы можете использовать операции ниже агрегатных конвейерный вместе:

  • Group все документы на основе их testNumber и тип result вместе, поэтому для каждого номера испытаний мы имели бы two групп по одному, один для fail и другой для pass, с количеством документов в каждой группе.
  • Project переменная «проход» для группы, содержащей результат как , и для другой группы не выполняется.
  • Group вместе снова документы, основанные на testNumber, и вставьте документы прохода и сбоя в массив.
  • Project поля в соответствии с требованиями.

Кодекс:

Results.aggregate([ 
{$group:{"_id":{"testNumber":"$testNumber","result":"$result"}, 
       "count":{$sum:1}}}, 
{$project:{"_id":0, 
      "testNumber":"$_id.testNumber", 
      "result":{$cond:[{$eq:["$_id.result","pass"]}, 
          {"pass":"$count"}, 
          {"fail":"$count"}]}}}, 
{$group:{"_id":"$testNumber", 
     "result":{$push:"$result"}}}, 
{$project:{"testNumber":"$_id","result":1,"_id":0}} 
],function(a,b){ 
// post process 
}) 

Образец данных:

db.collection.insert([ 
{ 
"_id":1, 
"testNumber":1, 
"result":"pass" 
}, 
{ 
"_id":2, 
"testNumber":1, 
"result":"pass" 
}, 
{ 
"_id":3, 
"testNumber":1, 
"result":"fail" 
}, 
{ 
"_id":4, 
"testNumber":2, 
"result":"pass" 
}]) 

образца о/р:

{ "result" : [ { "pass" : 1 } ], "testNumber" : 2 } 
{ "result" : [ { "fail" : 1 }, { "pass" : 2 } ], "testNumber" : 1 } 

переборе doc.result даст вам счетчик проходов и число неудачные тесты для testNumber.