PHP и MongoDB показывают результаты, сгруппированные по дате

0

У меня есть коллекция mongodb со следующими документами:

{
  "_id" : ObjectId("547af6aea3f0eba7148b4567"),
  "check_id" : "f5d654e7-257d-4a93-ae50-2d59dfeeb451",
  "chunks" : NumberLong(200),
  "num_hosts" : NumberLong(1000),
  "num_rbls" : NumberLong(163),
  "owner" : NumberLong(7901),
  "created" : ISODate("2014-11-30T10:51:26.924Z"),
  "started" : ISODate("2014-11-30T10:51:31.558Z"),
  "finished" : ISODate("2014-11-30T10:57:08.512Z")
}

{
  "_id" : ObjectId("54db19a858a5d395a18b4567"),
  "check_id" : "9660e510-1349-43f3-9d5e-8bf4b06179be",
  "chunks" : NumberLong(2),
  "num_hosts" : NumberLong(10),
  "num_rbls" : NumberLong(166),
  "owner" : NumberLong(7901),
  "created" : ISODate("2015-02-11T08:58:17.118Z"),
  "started" : ISODate("2015-02-11T08:58:18.78Z"),
  "finished" : ISODate("2015-02-11T08:58:47.486Z")
}


{
  "_id" : ObjectId("54db267758a5d30eab8b4567"),
  "check_id" : "9660e510-1349-43f3-9d5e-8bf4b06179be",
  "chunks" : NumberLong(2),
  "num_hosts" : NumberLong(10),
  "num_rbls" : NumberLong(166),
  "owner" : NumberLong(7901),
  "created" : ISODate("2015-02-11T09:52:55.388Z"),
  "started" : ISODate("2015-02-11T09:52:56.109Z"),
  "finished" : ISODate("2015-02-11T09:53:22.095Z")
}

Мне нужно получить результат и создать массив, подобный этому:

Array
(
    [2015-02-11] => array
        (
            //array with results from 2015-02-11
        )
    [2014-11-30] => array
        (
            //array with results from 2014-11-30
        )
)

Я знаю, что можно просто выполнить просто collection-> найти, а затем перебрать результаты и использовать php-логику для достижения моей цели, но можно ли это сделать с помощью манго? Может быть, использовать структуру агрегации?

EDIT: я хочу группировать результаты по "созданной" дате

Любая помощь будет высоко оценена.

  • 1
    Какую дату вы хотите сгруппировать как группу по created, started or finished ?
  • 0
    @yogesh спасибо! Я хочу сгруппировать его по дате создания.
Теги:
aggregation-framework

2 ответа

0
Лучший ответ

Мне удалось решить эту проблему, используя структуру агрегации. Вот ответ, если кому-то это понадобится.

$op = array(
    array(
        '$project' => array(
            'data' => array(
                'check_id' => '$check_id',
                'chunks' => '$chunks',
                'num_hosts' => '$num_hosts',
                'num_rbls' => '$num_rbls',
                'owner' => '$owner',
                'started' => '$started',
                'finished' => '$finished',
            ),
            'year' => array('$year' => '$created' ),
            'month' => array('$month' => '$created' ),
            'day' => array('$dayOfMonth' => '$created'),
        )
    ),
    array(
        '$group' => array(
            '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
            'reports_data' => array('$push' => '$data'),
        )
    ),
);

$c = $collection->aggregate($op);
2

Для этого используется group агрегации monogo aggregation mongo, поэтому ниже запрос может решить вашу проблему

db.collectionName.aggregate({
    "$group": {
    "_id": "$created",
    "data": {
        "$push": {
            "check_id": "$check_id",
            "chunks": "$chunks",
            "num_hosts": "$num_hosts",
            "num_rbls": "$num_rbls",
            "owner": "$owner",
            "started": "$started",
            "finished": "$finished"
        }
    }
    }
}).pretty()

Или

db.collectionName.aggregate({
    "$group": {
    "_id": "$created",
    "data": {
        "$push": "$$ROOT"
    }
    }
}).pretty()

Также в mongo 2.8 $ dateToString предоставляет возможность конвертировать дату ISO в строковый формат, так что ниже запрос также работает

db.collectionName.aggregate([
    {
    "$project": {
        "yearMonthDay": {
            "$dateToString": {
                "format": "%Y-%m-%d",
                "date": "$created"
            }
        },
        "check_id": "$check_id",
        "chunks": "$chunks",
        "num_hosts": "$num_hosts",
        "num_rbls": "$num_rbls",
        "owner": "$owner",
        "started": "$started",
        "finished": "$finished"
    }
    },
    {
    "$group": {
        "_id": "$yearMonthDay",
        "data": {
            "$push": "$$ROOT"
        }
    }
    }
]).pretty()
  • 0
    Извините, но ничего не возвращается ...
  • 0
    @ МиленМихалев Я думаю, что вместо collectionName вы должны написать название своей коллекции.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню