2016-03-21 29 views
3

我有以下格式的集合:

{ 
    "_id": 123, 
    "items": [{ 
     "status" : "inactive", 
     "created" : ISODate("2016-03-16T10:39:28.321Z") 
    }, 
    { 
     "status" : "active", 
     "created" : ISODate("2016-03-16T10:39:28.321Z") 
    }, 
    { 
     "status" : "active", 
     "created" : ISODate("2016-03-16T10:39:28.321Z") 
    } 
    ], 
    "status" : "active" 
} 

我想在狀態查詢的項目,使得與地位對象「主動」數組中僅返回,在查詢中也只返回最後2個。

目前我使用$過濾此操作,但我不能夠使用$切片$過濾(我認爲這是需要什麼,我的願望)一起。下面是我查詢的外觀現在:

db.collection('collection').aggregate([ 
{$match: {'status': 'active'}}, 
{ 
    $project: { 
     'items': { 
      $filter: { 
       input: '$items', 
       as: 'item', 
       cond: {$eq: ['$$item.status', 'active'] 
      } 
     } 
    } 
}]); 

什麼我得到現在的問題是正確的結果,它只是它返回的所有對象的項目場,我只是想最後2個對象。

回答

9

要獲得最後兩個元素,請使用$slice運算符,並將position操作數設置爲-2。當然slice操作符的第一個操作數是$filter表達式,它解析爲一個數組。

db.collection.aggregate([ 
    { "$match": { "items.status": "active" } }, 
    { "$project": { 
     "items": { 
      "$slice": [ 
       { "$filter": { 
        "input": "$items", 
        "as": "item", 
        "cond": { "$eq": [ "$$item.status", "active" ] } 
       }}, 
       -2 
      ] 
     } 
    }} 
]) 
+0

太棒了!謝謝 ;) – HVT7