gpt4 book ai didi

mongodb - 在一个查询中查找最接近的日期

转载 作者:行者123 更新时间:2023-12-02 00:52:06 24 4
gpt4 key购买 nike

我目前正在尝试找出一种方法来查找 mongoDB 中与我正在查找的条目最接近的日期。

目前我通过使用 2 个查询解决了该问题。一个使用 $gte 和 limit(1) 来查找下一个较大的日期,然后使用 $lte - limit(1) 来查看是否有更接近的日期可能会更低。

我想知道是否有一种方法可以在一次查询中找到最接近的日期,但无法找到与此相关的任何内容。

希望你能帮助我解决这个问题,或者至少告诉我这是唯一的方法。

db.collection.find({"time":{$gte: isoDate}}).sort({"time":1}).limit(1)
db.collection.find({"time":{$lte: isoDate}}).sort({"time":-1}).limit(1)

但我正在寻找一种在一个查询中执行此操作的方法,这样我就不必减去结果来找到最接近的结果。

最佳答案

我使用聚合解决了类似的问题。

示例数据:

{ 
"_id" : ObjectId("5e365a1655c3f0bea76632a0"),
"time" : ISODate("2020-02-01T00:00:00Z"),
"description" : "record 1"
}
{
"_id" : ObjectId("5e365a1655c3f0bea76632a1"),
"time" : ISODate("2020-02-01T00:05:00Z"),
"description" : "record 2"
}
{
"_id" : ObjectId("5e365a1655c3f0bea76632a2"),
"time" : ISODate("2020-02-01T00:10:00Z"),
"description" : "record 3"
}
{
"_id" : ObjectId("5e365a1655c3f0bea76632a3"),
"time" : ISODate("2020-02-01T00:15:00Z"),
"description" : "record 4"
}
{
"_id" : ObjectId("5e365a1655c3f0bea76632a4"),
"time" : ISODate("2020-02-01T00:20:00Z"),
"description" : "record 5"
}
{
"_id" : ObjectId("5e365a1655c3f0bea76632a5"),
"time" : ISODate("2020-02-01T00:25:00Z"),
"description" : "record 6"
}

我正在寻找最接近 ISODate('2020-02-01T00:18:00.000Z') 的记录。

db.test_collection.aggregate([
{
$match:
{
time:
{
$gte: ISODate('2020-02-01T00:13:00.000Z'),
$lte: ISODate('2020-02-01T00:23:00.000Z')
}
}
},
{
$project:
{
time: 1,
description: 1,
time_dist: {$abs: [{$subtract: ["$time", ISODate('2020-02-01T00:18:00.000Z')]}]}}
},
{
$sort: {time_dist: 1}
},
{
$limit: 1
}])

$match阶段设置了一个“时间窗口”。我在这个例子中用了 5 分钟。

$project 阶段添加了时间距离字段。这是每条记录从 ISODate('2020-02-01T00:18:00.000Z') 的查询时间开始的时间(以毫秒为单位)。

然后,我对 time_dist 字段进行排序,并将结果限制为 1,以返回时间最接近 ISODate('2020-02-01T00:18:00.000Z') 的记录。

聚合结果:

{ 
"_id" : ObjectId("5e365a1655c3f0bea76632a4"),
"time" : ISODate("2020-02-01T00:20:00Z"),
"description" : "record 5",
"time_dist" : NumberLong(120000)
}

关于mongodb - 在一个查询中查找最接近的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33348801/

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