【问题标题】:Find latest date of document based on 2 separate fields: month and year根据 2 个单独的字段查找文档的最新日期:月份和年份
【发布时间】:2020-06-17 06:18:24
【问题描述】:

我在 mongoDB 中有如下文件:

{username:String, paymentYear:Int, paymentMonth:Int}

我想查找用户名的最新文档,即与我们的 Date.now() 最接近的日期。实现它的最佳方法是什么?是否有任何我可以使用的 mongo 查询或者我应该编写自己的代码?

谢谢

【问题讨论】:

  • 您可以使用$dateFromParts聚合日期运算符构建一个date字段(年、月、日=1等),然后将其与Date.now()进行比较。在find方法中,需要使用$expr操作符才能使用$dateFromParts操作符进行匹配。

标签: javascript mongodb date


【解决方案1】:

这可以使用 MongoDB 的 $dateFromParts 阶段聚合管道来实现。

db.test.aggregate([
    {
        "$addFields": {
            "tempDate": {
                "$dateFromParts": {
                  year : '$paymentYear', 
                  month : '$paymentMonth',
                }
            }
        }
    },
    {
        "$sort": {"tempDate": -1}  // Change from `-1` to `1` For Ascending Order
    },
    {
        "$limit": 1 // Number of documents to be returned based on the sort order
    },
])

使用可以根据您的需要在$project 阶段而不是$addFields 阶段实现这一点以获得更好的优化。

注意:这仅适用于 MongoDB 3.6 及更高版本。

【讨论】:

  • 我认为您在排序之前错过了匹配阶段,以便定义要搜索的最高日期。否则只需为给定用户获取最新文档(按_id 排序)就足够了,前提是_id 生成留给数据库。
  • 感谢您指出。我忘了在$sort 管道之前添加$match 阶段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多