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

时间:2016-03-21 08:40:33

标签: 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"
}

我想查询状态字段,以便状态为'有效' 的对象仅为在数组中返回,并且在查询中只返回最后2个。

目前我正在使用 $ filter 进行此操作,但我无法将 $ slice $ filter 一起使用(其中我认为我需要的是必需的。以下是我的查询现在的样子:

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

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

1 个答案:

答案 0 :(得分: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 
            ] 
        } 
    }}
])