Как мне сгруппировать по дням / месяцам в mongoDB? - PullRequest
0 голосов
/ 27 сентября 2018

Вот как выглядит один документ:

{
    "login_Id": "c",
    "name": "Abhishek Soni",
    "location": "BLAHBLAH",
    "work": [
        {
            "date":ISODate("2014-01-01"),
            "total_time": 100,
        },
        {
            "date":ISODate("2014-09-02"),
            "total_time": 100,
        },
        {
            "date":ISODate("2014-01-01"),
            "total_time": 10,
        },
    ]
}

Я хочу выполнить запрос, который выдаст такой результат:

{login_Id: 'c', work:{'01' : 110, '02': 100, ... and so on}}

По сути, япросто хочу сгруппировать work часть месяца по месяцам.

Вот что я пробовал:

db.employees.aggregate([
    {
        "$project": {
            "_id": 0,
            "login_Id": 1,
            "time": {
                "$sum": "$work.total_time"
            }
        }
    },
    {
        "$group": {
            "_id": {
                "$dayOfYear": "$work.date"
            },
            "time": {
                "$sum": "$work.total_time"
            }
        }
    }
]);

Но это выдает null.Если я удалю предложение группы, я получу общую сумму (т. Е. 210). Что не так?

1 Ответ

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

Вы можете попробовать ниже агрегации

db.collection.aggregate([
  { "$unwind": "$work" },
  { "$match": { "work.date": { "$type": "date" }}},
  { "$group": {
    "_id": { "date": { "$dayOfMonth": "$work.date" }},
    "time": { "$sum": "$work.total_time" },
    "login_Id": { "$first": "$login_Id" }
  }},
  { "$group": {
    "_id": "$login_Id",
    "data": {
      "$push": {
        "k": { "$toString": "$_id.date" },
        "v": "$time"
      }
    }
  }},
  { "$project": {
    "work": { "$arrayToObject": "$data" },
    "_id": 0,
    "login_id": "$_id"
  }}
])

Выход

[
  {
    "login_id": "c",
    "work": {
      "1": 110,
      "2": 100
    }
  }
]
...