4e1ovek
@4e1ovek
PHP, Node.JS

Как сделать двойную группировку в MongoDB?

Здравствуйте. Впервые разбираюсь с MongoDB, возник вопрос при группировке данных.
Даны данные за два дня:
db.test.insert({
    "_id" : ObjectId("13edebb315d8952400407343"),
    "create_at" : ISODate("2012-12-19T12:00:00.000Z"),
    "item" : {
        "tags" : [ 
            "aaaa"
        ],
        "event" : "accepted",
    }
});
    
db.test.insert({
    "_id" : ObjectId("13edebb39e60c73800b35727"),
    "create_at" : ISODate("2012-12-19T12:05:00.000Z"),
    "item" : {
        "tags" : [ 
            "aaaa"
        ],
        "event" : "delivered"
    }
});

db.test.insert({
    "_id" : ObjectId("13edebb315d8952400407344"),
    "create_at" : ISODate("2012-12-19T13:40:00.000Z"),
    "item" : {
        "tags" : [ 
            "bbbb"
        ],
        "event" : "accepted",
    }
});

db.test.insert({
    "_id" : ObjectId("13edebb39e60c73800b35728"),
    "create_at" : ISODate("2012-12-19T13:45:00.000Z"),
    "item" : {
        "tags" : [ 
            "bbbb"
        ],
        "event" : "delivered"
    }
});

db.test.insert({
    "_id" : ObjectId("13edebb315d8952400407345"),
    "create_at" : ISODate("2012-12-20T16:30:00.000Z"),
    "item" : {
        "tags" : [],
        "event" : "accepted",
    }
});

db.test.insert({
    "_id" : ObjectId("13edebb39e60c73800b35729"),
    "create_at" : ISODate("2012-12-20T16:35:00.000Z"),
    "item" : {
        "tags" : [],
        "event" : "delivered"
    }
});

На выходе необходимо получить результат:
{
  "total_count": 6
  "items": [
    {
      "total_count": 2,
      "created_at": "Wed, 19 Dec 2012 00:00:00 GMT",
      "tags": {
        "aaaa": 1,
        "supporta": 1
      },
      "event": "sent"
    },
    {
      "total_count": 2,
      "created_at": "Wed, 19 Dec 2012 00:00:00 GMT",
      "tags": {
        "aaaa": 1,
        "supporta": 1
      },
      "event": "delivered"
    },
    {
      "total_count": 1,
      "created_at": "Wed, 20 Dec 2012 00:00:00 GMT",
      "tags": {},
      "event": "sent"
    },
    {
      "total_count": 1,
      "created_at": "Wed, 20 Dec 2012 00:00:00 GMT",
      "tags": {},
      "event": "delivered"
    }
}

Пока удалось сформировать часть необходимых данных, запросом:
db.test.aggregate([ 
  {$group:      
   {          
     _id:{event:'$item.event', doy:{$dayOfYear:'$create_at'} },
     total_count:{$sum:1},
     created_at:{$first: '$create_at'},
     tags: {$addToSet: '$item.tags'}
   },
  },
  {$project:{total_count:1,  _id:0, event:'$_id.event', created_at:1, tags:1}}
])

Но как, получить необходимую информацию о тегах, то есть массив тегов и их количество?
А так же в дате указать начало дня 00:00:00?
  • Вопрос задан
  • 2453 просмотра
Пригласить эксперта
Ответы на вопрос 1
Tark
@Tark
Pyramid'альный мир
Есть $unwind, который разворачивает списки. К сожалению, пустые списки будут проигнорированы. $addToSet добавляет в набор только уникальные значения, лучше использовать $push, который суёт в список всё, что ему дадут.

Чтобы в дате указать начало дня, можно воспользоваться $match: {created_at: {$regex: '*00:00:00*'}}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы