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

Ren*_*okK 10 mongoose mongodb

我正在试图找到一种方法来找到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)
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种方法在一个查询中执行此操作,所以我不必减去结果以找到最接近的结果.

小智 6

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

样本数据:

{ 
  "_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"
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找最接近 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
}])
Run Code Online (Sandbox Code Playgroud)

$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)
}
Run Code Online (Sandbox Code Playgroud)


Alo*_*wal 1

检查这个

db.collection.find({"time":{$gte: isoDate,$lt: isoDate}}).sort({"time":1}).limit(1)
Run Code Online (Sandbox Code Playgroud)

请使用 mongodb 支持的相同格式,如下所示

ISODate("2015-10-26T00:00:00.000Z")
Run Code Online (Sandbox Code Playgroud)

  • 我相信我理解查询的意图,但我不认为它是正确的。我发现检索与 Mongo 最接近的日期的唯一方法是通过原始海报建议的两个查询。 (7认同)
  • 大家确定这个答案吗?当我运行该查询时,我没有收到任何返回的文档。如果我正确理解查询,$time 属性将需要既小于又大于或等于 isoDate,这是不可能的。 (2认同)