2017-01-25 5 views
1

У меня есть коллекция как этотMongoDB множественной группы по

{ 
    customerid: '1' 
    date : "2017-01-20T14:56:59.301Z" 
    status: 'active' 
}, { 
    customerid: '1' 
    date : "2017-01-20T16:56:59.301Z" 
    status: 'inactive' 
}, { 
    customerid: '2' 
    date : "2017-01-20T12:56:59.301Z" 
    status: 'inactive' 
}, { 
    customerid: '2' 
    date : "2017-01-20T13:56:59.301Z" 
    status: 'inactive' 
}, { 
    customerid: '3' 
    date : "2017-01-20T12:56:59.301Z" 
    status: 'inactive' 
}, { 
    customerid: '3' 
    date : "2017-01-20T22:56:59.301Z" 
    status: 'active' 
}, { 
    customerid: '1' 
    date : "2017-01-22T22:56:59.301Z" 
    status: 'active' 
}, { 
    customerid: '1' 
    date : "2017-01-21T19:56:59.301Z" 
    status: 'active' 
}, { 
    customerid: '2' 
    date : "2017-01-21T17:56:59.301Z" 
    status: 'inactive' 
}, { 
    customerid: '2' 
    date : "2017-01-21T18:56:59.301Z" 
    status: 'active' 
} 

Теперь я хочу, чтобы принести в день на одного клиента последнего статуса так для 2017-01-20: я должен получить

{Customerid :1,status :"inactive",date : "2017-01-20T16:56:59.301Z" }, 
{Customerid :2,status :"inactive",date : "2017-01-20T13:56:59.301Z" }, 
{Customerid :3,status :"active" ,date : "2017-01-20T22:56:59.301Z"} 

(последний статус на основе на дату каждый день) и т. д.

Пробовал запрос агрегации с группой, но не смог решить эту проблему.

<pre> 
db.test.aggregate([ 
{$match : { 
       "updateddate" : { $gte: ISODate("2017-01-01T00:00:00.000Z"),$lt: ISODate("2017-01-01T23:59:59.000Z") }}}, 
    { $sort: { customerid: 1, updateddate: 1 } }, 
    { $group: { 
     _id: { customerid: '$customerid', year : { $year : "$updateddate" },   
      month : { $month : "$updateddate" },   
      day : { $dayOfMonth : "$updateddate" },status : "$status" } 
    }}, 
    { $group: { 
     _id: '$_id.status', 
     Count: { $sum: 1 } 
    }}, 
    { $project: { 
     _id: 0, 
     status: '$_id', 
     Count: 1 
    }}] 
    , function(err, result){ 
     console.log(result); 
    } 
); 
+0

добавлен мой запрос. Просто пытаюсь получить данные между датами. Даты будут динамичными, так как они будут получены из пользовательского интерфейса. – MKS

ответ

0

Похоже, вы можете сделать это немного проще, используя $last;

> db.customers.insert([ 
    { customerid: '1', date : ISODate("2017-01-20T14:56:59.301Z"), status: 'active' }, 
    { customerid: '1', date : ISODate("2017-01-20T16:56:59.301Z"), status: 'inactive' }, 
    { customerid: '2', date : ISODate("2017-01-20T12:56:59.301Z"), status: 'inactive' }, 
    { customerid: '2', date : ISODate("2017-01-20T13:56:59.301Z"), status: 'inactive' }, 
    { customerid: '3', date : ISODate("2017-01-20T12:56:59.301Z"), status: 'inactive' }, 
    { customerid: '3', date : ISODate("2017-01-20T22:56:59.301Z"), status: 'active' }, 
    { customerid: '1', date : ISODate("2017-01-22T22:56:59.301Z"), status: 'active' }, 
    { customerid: '1', date : ISODate("2017-01-21T19:56:59.301Z"), status: 'active' }, 
    { customerid: '2', date : ISODate("2017-01-21T17:56:59.301Z"), status: 'inactive' }, 
    { customerid: '2', date : ISODate("2017-01-21T18:56:59.301Z"), status: 'active' } 
]) 

> db.customers.aggregate( 
    {$match : {date : { $gte: ISODate("2017-01-01T00:00:00.000Z"), 
         $lt: ISODate("2017-01-20T23:59:59.000Z") }}},  
    {$sort: {date:1}},  
    {$group: {_id:"$customerid", status: { $last: "$status"}}} 
) 

{ "_id" : "1", "status" : "inactive" } 
{ "_id" : "3", "status" : "active" } 
{ "_id" : "2", "status" : "inactive" } 
+0

Спасибо Joachim Так как я новичок в mongo, так что нужно немного времени, чтобы понять концепцию. Еще одна помощь, если я хочу получить счет того же статуса. Как я могу это сделать – MKS

+0

@Mritunjay Не совсем уверен, как вы имеете в виду, хотите ли вы подсчитать все статусы для этого пользователя или всех статусов, которые совпадают с последними? –

+0

, например, для 2017-01-25 У меня есть 10 клиентов со статусом как активный, 20 как неактивный, поэтому я хочу в день со списком статуса и его счет. {_id: "2017-01-25", "status": [ {"inactive", Count: 20}, {"active": 10}]} – MKS

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