【问题标题】:Mongoose find nested records in specific recordMongoose 在特定记录中查找嵌套记录
【发布时间】:2016-09-14 22:12:29
【问题描述】:

我的猫鼬模型/模式设置如下:

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'

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    如果您的 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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多