mongoose在特定logging中查找嵌套logging

我有我的mongoose模型/架构像这样设置:

var servers = mongoose.model('Servers', new mongoose.Schema({ server_id : String, timestamps: [] })); 

我在哪里保存服务器的logging,存储他们的服务器ID,以及包含unix时间戳的数组,这些数据在收到请求时被填充/更新。

我想查询timestamps数组,查找两个时间戳之间的结果,对于特定的server_id,例如伪代码,我正在尝试做这样的事情;

 'find servers.timestamps between timeFrom and timeTo where server_id = serverId' 

一种方法是如果您的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 )false值(从$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); });