2015-10-02 2 views
1

Представьте себе следующее:Как можно найти последующие результаты, используя конвейер агрегации MongoDB?

{ 
    "user" : "john", 
    "type" : "connect", 
    "created" : ISODate("2015-10-02T10:00:00.000Z"), 
    "__v" : 0 
}, 
{ 
    "user" : "john", 
    "type" : "disconnect", 
    "created" : ISODate("2015-10-02T10:10:00.000Z"), 
    "__v" : 0 
}, 
{ 
    "user" : "frank", 
    "type" : "connect", 
    "created" : ISODate("2015-10-02T10:05:00.000Z"), 
    "__v" : 0 
}, 
{ 
    "user" : "frank", 
    "type" : "disconnect", 
    "created" : ISODate("2015-10-02T10:15:00.000Z"), 
    "__v" : 0 
}, 
{ 
    "user" : "john", 
    "type" : "connect", 
    "created" : ISODate("2015-10-02T10:15:00.000Z"), 
    "__v" : 0 
} 

Я хочу создать ППР-отчет, говоря «пользователь джон был 5 минут простоя». Сейчас я полностью в темноте, я превратился в агрегирование, а также mapReduce, но ничто не указывает на то, в каком направлении оно мне нужно. Я мог бы решить это, используя простой javascript, но я хочу избежать этого, так как MongoDB сделан таким образом для агрегации этих видов. Может быть, я просто застрял у меня в голове и должен немного отдохнуть, но, возможно, у кого-то есть хорошее решение для меня.

Так лучший результат будет (я думаю):

{ 
    "user" : "john", 
    "outage": "5" 
} 

Помимо этого «оптимального», например, могут быть случаи, когда отсоединяется глотают системой при развертывании новой версии сервера. Это около 10 секунд, и я думаю о том, чтобы оставить их для удобства.

+0

А как насчет откровенности? У него не будет новой записи для подключения? –

+0

Уверен, что у него может быть новая запись для подключения. Простой сценарий пользовательской базы данных, но с документацией об отключении, так как мои пользователи имеют вид-ap (i/e). – wegginho

ответ

1

Запрос

db.collection.aggregate([{$group:{_id:{user:"$user",type:"$type"},created:{$max:"$created"}}},{$sort:{"_id.user":1,"_id.type":-1}},{$group:{_id:"$_id.user","latest_disconnected":{"$first":"$created"},"latest_connected":{$last:"$created"}}},{$project:{outage:{$divide:[{"$subtract": [ "$latest_connected", "$latest_disconnected" ] },60000]}}}]) 

Выход

{ "_id": "Джон", "отключение": 5}

{ "_id": "откровенного", " отключение ": -10}

Подробнее об этом

Это даст вам самую последнюю запись каждого пользователя для типа подключен и отсоединен

{$group:{_id:{user:"$user",type:"$type"},created:{$max:"$created"}}} 

Не забудьте сортировать пользователя и типа, группа не гарантируется отсортирован выход

{$sort:{"_id.user":1,"_id.type":-1}} 

Поскольку каждый пользователь будет иметь 2 записи из предыдущего трубопровода, поэтому первая запись будет для последнего отключения и последней (второй) записи для последней подключения

{$group:{_id:"$_id.user","latest_disconnected":{"$first":"$created"},"latest_connected":{$last:"$created"}}} 

Это простая математика, разница между 2 даты и превращали в мин

{$project:{outage:{$divide:[{"$subtract": [ "$latest_connected", "$latest_disconnected" ] },60000]}}} 

Надеется, что это поможет

+0

благодарит за отзыв, завтра выпустите этот снимок! – wegginho

+0

благодарит за вашу документально подтвержденную помощь, хотя на самом деле это не по-настоящему искало то, что я искал. Может быть, я не спросил достаточно ясно.В любом случае я закрою этот вопрос, так как мое решение было близко и основано на javascript. – wegginho

+0

Что вы ищете? –

Смежные вопросы