gpt4 book ai didi

javascript - Mongoose 在特定记录中查找嵌套记录

转载 作者:太空宇宙 更新时间:2023-11-04 00:39:55 25 4
gpt4 key购买 nike

我的 Mongoose 模型/架构设置如下:

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'

最佳答案

一种方法是使用 $filter 运算符,如果您的 MongoDB 服务器是 3.2.X或更大。以下示例过滤 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);
});

关于javascript - Mongoose 在特定记录中查找嵌套记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37299361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com