Агрегирование переключателей MongoDB $ всегда падает в случае по умолчанию - PullRequest
0 голосов
/ 06 сентября 2018

У меня следующая монго (упрощенная) агрегация:

db.getCollection('oees').aggregate([
{ $match: {"$or":[
        {"$and":[{"resId": ObjectId("568b9eb32847fe2000e0b071")},{"attachment":"turbine1"},{"date":{"$gte":ISODate("2018-04-01T00:00:00.000Z"),"$lte":ISODate("2018-06-30T00:00:00.000Z")}}]}
        {"$and":[{"resId": ObjectId("...")},{"attachment":"..."},{"date":{"$gte":ISODate("..."),"$lte":ISODate("...")}}]}
]}}, { $group: {
      _id: { date: { $dateToString: { format: '‌%Y-%m', date: '$date' } }, resId: '$resId', attachment: '$attachment' },
    } },
    { $project: {
      _id: 1,
      resId: '$_id.resId',
      attachment: '$_id.attachment',
      date: '$_id.date',
      hoursCount: {'$switch':{'branches':[
        {'case':{'$eq':['$_id.date','2018-04']},'then':696},
        {'case':{'$eq':['$_id.date','2018-05']},'then':720},
        {'case':{'$eq':['$_id.date','2018-06']},'then':696}
      ], default:'$_id.date'}}
    } }
])

Агрегация запрашивает коллекцию "oees", которая состоит из таких документов:

{
    "_id" : ObjectId("589cc8e894e30b006989627b"),
    "date" : ISODate("2017-01-01T00:00:00.000Z"),
    "resId" : ObjectId("568b9eb32847fe2000e0b071"),
    "attachment" : "turbine1",
    "createAt" : ISODate("2017-02-09T19:54:13.537Z"),
    "updatedAt" : ISODate("2017-02-09T19:54:13.537Z"),
    "indicator" : "availabilityLosses",
    "value" : 0,
    "unit" : "hours"
}

И это дает мне, например, следующий результат:

{
    "_id" : {
        "date" : "‌2018-06",
        "resId" : ObjectId("568b9eb32847fe2000e0b071"),
        "attachment" : "turbine1"
    },
    "resId" : ObjectId("568b9eb32847fe2000e0b071"),
    "attachment" : "turbine1",
    "date" : "‌2018-06",
    "hoursCount" : "‌2018-06",
}

Но я не могу понять, почему hoursCount равно 2018-06, поскольку это был один из случаев моего $switch, который должен был логически разрешиться до 696 ... но иметь разрешено в случае по умолчанию.

Любая помощь будет оценена :)

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Я наконец нашел решение. По неизвестной причине $dateToString вставляет невидимый символ в первую позицию результирующей строки.

Этот невоспроизводимый символ известен как 100 ШИРОКИЙ ШУМ, НЕТ СОЕДИНЯЮЩИЙСЯ (U + 200C) , и его можно найти в блоке общей пунктуации. Он представлен с:

  • ‌UTF-8: 0xE2 0x80 0x8C
  • UTF-16: 0x200C
  • Побег восьмеричный C UTF-8: \ 342 \ 200 \ 214
  • Десятичная сущность XML: 101
0 голосов
/ 06 сентября 2018

Изменить второй и третий шаг агрегации. Второй шаг должен быть таким, как указано ниже

    // Stage 2
    {
        $group: {
            _id: { 
            //  date: { $dateToString: { format: '‌%Y-%m', date: '$date' } }, 
              date: '$date', 
              resId: '$resId', attachment: '$attachment' 
              }
        }
    },

Третий шаг, как указано ниже

{
        $project: {
               _id: 1,
              resId: '$_id.resId',
              attachment: '$_id.attachment',
              date: '$_id.date',
                "hoursCount" :
                        {
                            $switch:
                            {
                                branches: [
                                {
                                    case: {'$eq':['$_id.date',new Date('2018-01-01')]},
                                    then: 696
                                },
                                {
                                    case: {'$eq':['$_id.date',new Date('2018-05-01')]},
                                    then: 720
                                },
                                {
                                    case: {'$eq':['$_id.date',new Date('2017-06-01')]},
                                    then: 696
                                }
                                ],
                                default: '$_id.date'
                            }
                        },
        }
    },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...