当前位置: 首页 > 知识库问答 >
问题:

按最接近字段的日期对Mongodb查询中的文档进行排序

况嘉运
2023-03-14

我在mongodb中收集了一些代表过去和未来事件的文档。文档中有两个日期字段“开始”和“结束”,它们是bson ISODATE对象。我正在做一个查找查询,它获取了不超过3天前结束的所有事件。

db.events.find({'end': {'$gte': datetime.utcnow() - timedelta(days=3)})

如何根据事件的今天和结束日期之间的时间(和日期)对该查询的响应进行排序。换句话说,2天前结束的事件应该发生在大约与2天后发生的事件相同的位置。这很重要,因为我不想首先显示所有已经发生的事件,也不想首先显示未来发生的最远的事件。

共有2个答案

卫建义
2023-03-14

我看不出有什么方法可以让MongoDB为你做这件事,因为mongo目前不支持使用函数进行排序。

然而,如果你的范围总是以当前日期为中心,为什么不每天晚上更新一个字段,存储当前日期和事件之间的时间增量呢?这样你就可以对它进行索引和排序。如果你保留了多年的数据,你可能只需要更新几周的数据,以获得恒定的时间更新,而不是随着数据的增长而增长。

薛望
2023-03-14

如果我没弄错的话,你想根据今天和活动结束日期之间的时间差来排序。因此,如果你明天有一个活动,昨天有一个活动,前一天有一个活动,你希望它们的顺序是:

  1. 明天的活动
  2. 昨天的活动
  3. 前天的活动

其中,根据实际时差,1和2可以互换。

这肯定可以用MongoDB的聚合框架来完成。它的工作原理如下:

  1. 匹配在特定时间段内结束的文档

所以它应该是这样的:

db.events.aggregate([
    { '$match':
        { 'end':
            { '$gte': datetime.utcnow() - timedelta(days=3) } 
        }
    },
    { '$project':
        {
            'timeDelta': { 
                '$subtract': ['$end', datetime.utcnow()]
            }
        }
    },
    { '$project':
        {               
            'absTimeDelta' : { 
                '$cond' : [
                    { '$lte': ['$timeDelta', 0] },
                    { '$multiply' : ['$timeDelta', -1 ] },
                    '$timeDelta'
                ]
            }
        }
    },
    { '$sort':
        {
            'absTimeDelta' : 1
        }
    }
])

编辑:在MongoDB 3.2版本中,这个JIRA票证已经被修复,引入了$abs运算符。这意味着第二个$project可以被删除,第一个可以被更新。代替'$减法':['$end',datetime.utcnow()]您可以使用$abs:{'$减法':['$end',datetime.utcnow ()] }

 类似资料:
  • 问题内容: 让我们 我想按日期和时间键对输出进行排序。 非常感谢你。 问题答案: 对于GNU排序: 按月份按第二列排序(这样,“三月”排在“四月”之前) 在数字模式下按第三列排序(因此,“ 9”位于“ 10”之前) 按第四列排序。 请参见手册中的更多详细信息。

  • 问题内容: 我将MongoDB与Node.JS结合使用。我有一个包含日期和其他行的集合。日期是一个JavaScript 对象。 如何按日期排序此收藏集? 问题答案: 只需对@JohnnyHK答案进行一些修改 在许多用例中,我们希望返回最新记录(例如最新更新/插入)。

  • 每月,我想从我的一个集合中删除所有超过1个月的文档。集合中的示例文档如下所示: 我希望自动安排此任务的执行,这样它就不需要人工输入(例如,作为cron作业),因此我希望它具有尽可能少的逻辑。 如何查询createDate早于1个月的文档?我曾想过尝试这样的事情: 。。。其中,我创建了一个当前时间减去1个月毫秒的新ISODate,但它不会返回任何数据。这也有点难看,即使它确实有用。我将如何实现这一点

  • 问题内容: 我在集合中将值存储为java.util.Date(),但是当我查询以获取两个特定日期之间的值时,最终得到的值超出了范围。这是我的代码: 插入 查询 当我在和之间查询时(基本上是fromDate = toDate),我得到的日期绝对不可能的对象。我在这里想念什么? 问题答案: 您正在执行的操作是仅在键覆盖中使用丢失运算符进行查询。您想要的是:

  • 问题内容: 我有以下postgresql语法,该语法返回WHERE session_date与$ date_string匹配的值 问题是有时$ date_string在表中不可用,所以我想返回最接近$ date_string的日期。 有什么想法可以做到这一点吗? 问题答案: 如果您想要最近的日期,请按照以下方式进行操作: 之后的最接近日期使用类似的逻辑。 对于最接近的一方:

  • 问题内容: 我发现的每个示例都是按字母顺序进行的,而我需要按日期对元素进行排序。 我的ArrayList包含其数据成员之一是DateTime对象的对象。在DateTime上,我可以调用以下函数: 因此,我可以做一些比较: 我应该在if块内做什么? 问题答案: 你可以使对象具有可比性: 然后通过调用以下命令对其进行排序: 但是,有时你不想更改模型,例如想要对几个不同的属性进行排序时。在这种情况下,你