蒙戈德布多组



我有这样的集合

{
  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);
    }
);

似乎您可以使用 $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" }

最新更新