如果您的 MongoDB 服务器为 3.2.X 或更高版本,则一种方法是使用 $filter 运算符。
以下示例过滤 timestamps 数组以仅包含在给定范围内的时间戳,即 timeFrom <= t <= timeTo:
servers.aggregate([
{
"$match": {
"server_id": serverId,
"timestamps": {
"$gte": timeFrom,
"$lte": timeTo
}
}
},
{
"$project": {
"server_id": 1,
"timestamps": {
"$filter": {
"input": "$timestamps",
"as": "t",
"cond": {
"$and": [
{ "$gte": [ "$$t", timeFrom ] },
{ "$lte": [ "$$t", timeTo ] }
]
}
}
}
}
}
]).exec(function (err, result){
console.log(result);
});
另一种方法(如果您的驱动程序不支持 MongoDB 版本 3.2.X 或更高版本,即支持 >=2.6.X 和 <=3.0.X)将使用 $map 和$setDiference 运算符投影一个过滤数组,您可以在其中过滤掉(使用 $setDiference)假值(派生自 $map运算符),如下例所示:
servers.aggregate([
{
"$match": {
"server_id": serverId,
"timestamps": {
"$gte": timeFrom,
"$lte": timeTo
}
}
},
{
"$project": {
"server_id": 1,
"timestamps": {
"$setDifference": [
{
"$map": {
"input": "$timestamps",
"as": "t",
"in": {
"$cond": [
{
"$and": [
{ "$gte": [ "$$t", timeFrom ] },
{ "$lte": [ "$$t", timeTo ] }
]
},
"$$t",
false
]
}
}
},
[false]
]
}
}
}
]).exec(function (err, result){
console.log(result);
});