如何在MongoDB中切片$ filter结果?

HVT*_*VT7 3 mongodb mongodb-query aggregation-framework

我有一个具有以下格式的集合:

{
    "_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"
}
Run Code Online (Sandbox Code Playgroud)

我想查询项目的状态字段,以便状态为"活动"的对象仅在数组中返回,并且在查询中仅返回最后2个.

目前我使用$ filter进行此操作,但我无法使用$ slice$ filter(我认为这是我想要的).以下是我的查询现在的样子:

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

我现在得到的是正确的结果,只是它返回items字段中的所有对象,我只想要最后2个对象.

sty*_*ane 11

要获取最后两个元素,请使用$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 
            ] 
        } 
    }}
])
Run Code Online (Sandbox Code Playgroud)