在默认情况下,MongoDB $ switch的聚集始终处于下降状态

时间:2018-09-06 09:53:48

标签: mongodb

我有以下Mongo(简化)聚合:

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 :(得分:0)

  

更改聚合的第二和第三步。   第二步应如下所述

  async callQuery() {
    return await new Promise((resolve, reject) => {
      this.httpclient.get(MyUrl).subscribe((response) => {
        resolve(response);
      });
    });
  }

  async WhateverFunction() {
    ...
    const MyVar = await this.callQuery());
    console.log(MyVar);
    ...
  }
  

如下所述的第三步

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

答案 1 :(得分:0)

我终于找到了解决方案。出于未知原因,$dateToString在结果字符串的第一个位置插入了不可见的字符。

此无法显示的字符称为‌‌ 零宽度非JOINER(U + 200C),可在“常规标点”块中找到。表示为:

  • ‌UTF-8:0xE2 0x80 0x8C
  • UTF-16:0x200C
  • 逸出的八进制C UTF-8:\ 342 \ 200 \ 214
  • 十进制XML实体:‌