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); });
- 路由文件无法在Express.js中更新
- Uncaught TypeError:无法在反应中读取null属性的“状态”
- 无法使用HTTP Put更新MongoDB集合中的对象?
- Node.js,Javascript:node-debug不会检测Google Chrome
- 将一个对象从jade传递给angularjs模板
- Node.js – 调用系统命令或外部命令
- Socket.io否请求的资源上存在“Access-Control-Allow-Origin”标题。 Origin'http:// localhost'因此不被允许访问
- Node.js请求下载文件有时为空或不存在
- 在NPM作用域包中公开两个(或更多)Node.js Babel类