MongoDB - MySQL SUM (CASE WHEN) Эквивалент? - PullRequest
2 голосов
/ 20 января 2012

Я пытаюсь провести некоторое тестирование с Mongo, я понял, что некоторые простые запросы MySQL эквивалентны Mongo.

У меня есть немного более сложный запрос, с которым мне нужна помощь ...

SELECT DISTINCT dims_user,
    COUNT(DISTINCT asset_name) AS asset_count,
    COUNT(DISTINCT system_name) AS station_count,
    SUM(CASE WHEN details ='viewed' then 1 Else 0 end) AS viewed_count,
    SUM(CASE WHEN details Like 'Viewed Web%' then 1 Else 0 end) AS Web_count,
    SUM(CASE WHEN details = 'ThumbView' then 1 Else 0 end) AS ThumbView_count,
    SUM(CASE WHEN details Like 'Exported%' then 1 Else 0 end) AS Exported_count,
    SUM(CASE WHEN details Like '%Print%' then 1 Else 0 end) AS Printed_count
FROM asset_log GROUP BY dims_user;

Ответы [ 3 ]

1 голос
/ 24 октября 2013

Проверьте эту ссылку, она может помочь:

http://www.kchodorow.com/blog/2011/12/09/sql-to-mongodb-an-updated-mapping/

В ней объясняется, как разбить инструкцию SQL CASE WHEN и заменить каждый фрагмент SQL новым синтаксисом конвейера агрегации.Ниже приведен пример для первого случая, когда в вашем утверждении:

{
  $project : {
    'viewed': {
        '$cond': [ 
            {'$eq': ['$details', 'viewed'] },
            1, // if true
            0] // else
    }
  }
}
1 голос
/ 11 февраля 2014

Может быть ниже пример, полезный для вас.

Допустим, у вас есть следующие примеры данных.

db.sample.insert([
{
  "_id" : 27001,
  "assigned_to" : "abc@xyz.com",
  "priority" : "High"
}
,{
  "_id" : 27002,
  "assigned_to" : "jkdj@xyz.com",
  "priority" : "Low"
},
{
  "_id" : 27003,
  "assigned_to" : "abc@xyz.com",
  "priority" : "High"
}
]);

Используйте приведенный ниже агрегированный запрос, чтобы получить

1. Общее количество

2.Count, где assigend_to - «abc@xyz.com»

3.Count, где приоритет - «High»

db.sample.aggregate({$group:{
                                 _id: 0,total:{$sum:1},
                                'assigned_to' : { $sum : { $cond: [ {  $eq: [ '$assigned_to' , 'abc@xyz.com' ] }, 1, 0 ] } },
                                'hight_priority' : { $sum : { $cond: [ {  $eq: [ '$priority' , 'High' ] }, 1, 0 ] } }
                              } 
                        } 
                      );

И вы получите ожидаемый результат

{
    "result" : [
        {
            "_id" : 0,
            "total" : 3,
            "assigned_to" : 2,
            "hight_priority" : 2
        }
    ],
    "ok" : 1
}
1 голос
/ 23 января 2012

Я бы согласился с Руду здесь, поскольку вы должны попытаться разбить детали на ключи документа монго.

Документ может содержать такой объект:

details:
{
  viewed: true
  thumb_view: true
  web_viewed: false
  exported: true
  ...
}

Если вы не реструктурируете данные, для запроса потребуются нерутированные регулярные выражения, которые не могут использовать функции индексирования MongoDB.

Однако, независимо от того, решите ли вы это или нет, вы захотите использовать для этого уменьшение карты. Вы можете генерировать элементы, которые содержат детали во время карты (либо обрабатывая их с помощью регулярных выражений, либо просто выделяя ключи в реструктурированной форме), и суммировать их в фазе сокращения.

Подробнее об этом можно прочитать в документах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...