我有一个具有以下格式的集合:
{
"_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个对象。
答案 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
]
}
}}
])