MongoDB - 如何获取上个月的记录

如何在 MongoDB 中获取上个月的记录?

以下是用于执行相同操作的 MYSQL 查询:

SELECT * FROM table
WHERE YEAR(createdon) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(createdon) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
stack overflow MongoDB - How to get last month records
原文答案
author avatar

接受的答案

解决方案 1: $wheredb.collection.find() 运算符


Supported version: **Before 4.4**

您可以使用 Javascript $where 支持的 function()

db.collection.find({
  $where: function() { 
    var currentDate = new Date(); 
    var lastMonthDate = new Date(currentDate.setMonth(currentDate.getMonth() - 1)); 

    return this.createdOn.getFullYear() === lastMonthDate.getFullYear() 
      && this.createdOn.getMonth() === lastMonthDate.getMonth(); 
  }
})

Note: Wrap the function with the quotes in Mongo Playground is due to [reported Github issue](https://github.com/feliixx/mongoplayground/issues/62).

Sample Solution 1 on Mongo Playground


解决方案 2:将 $dateAdd 用于 db.collection.aggregate()


Supported version: **5.0**

在 5.0 版本中引入了 $dateAdd ,您可以执行如下查询:

  1. $match

    • 使用 $match 管道,使用 $expr 查询表达式来包含聚合操作。

    • $and 运算符确保两个表达式都得到满足。

    • 使用 $dateAdd 运算符将月份(单位)加上 -1(金额)得到 previous month date

    • $month$year 分别用于从日期获取月份和年份值。

    • 并执行 $eq 运算符来检查 $month 中的 $yearcreatedOn 是否分别与 $month 中的 $yearprevious month date 匹配。

    
    db.collection.aggregate([
    {
    $match: {
      $expr: {
        $and: [
          {
            "$eq": [
              {
                $month: "$createdOn"
              },
              {
                $month: {
                  $dateAdd: {
                    startDate: new Date(),
                    unit: "month",
                    amount: -1
                  }
                }
              }
            ]
          },
          {
            "$eq": [
              {
                $year: "$createdOn"
              },
              {
                $year: {
                  $dateAdd: {
                    startDate: new Date(),
                    unit: "month",
                    amount: -1
                  }
                }
              }
            ]
          }
        ]
      }
    }
    }
    ])

 [Sample Solution 2 on Mongo Playground](https://mongoplayground.net/p/Coint6X88uw) 

* * *

解决方案 3:将  `$dateFromParts`  用于  `db.collection.aggregate()` 
-------------------------------------------------- ---------------

 `Supported version: **From 3.6**` 

您也可以使用此  [`$dateFromParts`](https://docs.mongodb.com/manual/reference/operator/aggregation/dateFromParts/)  建议的  [Jira comment](https://jira.mongodb.org/browse/SERVER-10651?focusedCommentId=2305913&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-2305913)  申请。

db.collection.aggregate([
{
$match: {
$expr: {
$and: [
{
"$eq": [
{
$month: "$createdOn"
},
{
$month: {
$let: {
"vars": {
"todayDate": new Date()
},
"in": {
$dateFromParts: {
year: {
$year: "$$todayDate"
},
month: {
$subtract: [
{
$month: "$$todayDate"
},
1
]
},
day: {
$dayOfMonth: "$$todayDate"
}
}
}
}
}
}
]
},
{
"$eq": [
{
$year: "$createdOn"
},
{
$year: {
$let: {
"vars": {
"todayDate": new Date()
},
"in": {
$dateFromParts: {
year: {
$year: "$$todayDate"
},
month: {
$subtract: [
{
$month: "$$todayDate"
},
1
]
},
day: {
$dayOfMonth: "$$todayDate"
}
}
}
}
}
}
]
}
]
}
}
}
])



 [Sample Solution 3 on Mongo Playground](https://mongoplayground.net/p/7C7C9KXgQmF) 

答案:

作者头像

您可以使用 $gte 和 $lte 选项选择两个日期之间的记录。例子:

db.getCollection('your-collection-name').find({
  {createdAt:{$gte:ISODate(“2020-03-01”),$lt:ISODate(“2021-03-31”)}}
})

有关这些运算符的更多信息: