猫鼬在特定记录中查找嵌套记录
Mongoose find nested records in specific record
我把我的猫鼬模型/模式设置成这样:
var servers = mongoose.model('Servers', new mongoose.Schema({
server_id : String,
timestamps: []
}));
我保留服务器的记录,存储它们的服务器 ID 和一个包含 unix 时间戳的数组,该数组在它们收到请求时填充/更新。
我想查询时间戳数组,以查找两个时间戳之间的结果,针对特定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
(假值(从 $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);
});
相关文章:
- 用嵌套函数和默认函数定义函数
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 可以简化嵌套的延迟Q Promises解析吗
- 用于搜索的聚合物嵌套绑定
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- d3中堆栈函数和嵌套函数之间的差异
- 如何打印嵌套对象的所有值
- JavaScript 中的嵌套函数和 “this” 关键字
- 设置嵌套对象属性的更好方法
- querySelector/getElementByClassName嵌套项的顺序
- 猫鼬在特定记录中查找嵌套记录
- 访问嵌套JSON对象的键,其中键是动态的
- D3嵌套组作为x轴
- 不可变的js修改所有嵌套的记录
- 如何将新项推送到不可变JS中的深度嵌套记录中
- 使用嵌套条件记录字符串
- Ember中嵌套2层的嵌入记录
- 当更改嵌套值时,记录上的订阅不会触发
- 访问嵌套MySQL查询中的父记录
- Sails.js+Mongodb使用ORM插入嵌套的json记录