聚合将Mongodb与dateFromString

时间:2018-10-08 16:58:18

标签: mongodb

亲爱的尝试在mongo中按日期进行过滤,但我没有成功。我通过了我的查询和JSON结构。

db.getCollection('articles').aggregate([
{ "$match": {
 "$expr": {
  "$and": [
    {
      "$gte": [
        { "$dateFromString": { "creationDate": "10-08-2018", "format": "%m-%d-%Y" }}
      ]
    },
    {
      "$lte": [
        { "$dateFromString": { "creationDate": "10-08-2018", "format": "%m-%d-%Y" }}
      ]
    }
  ]
}
}}
])

我的JSON是

{
"_id" : ObjectId("5bbb6b1de75b933850a608fc"),
"title" : "05",
"body" : "asgfasgasfa",
"creationDate" : ISODate("2018-10-08T14:35:07.000Z"),
"operationType" : "C",
"__v" : 0
}

MongoDB:v3.6.3

2 个答案:

答案 0 :(得分:1)

如果您要从日期字段中查找“ 10-08-2018”的匹配项,则可以将$dateToString$eq结合使用:

db.getCollection('articles').aggregate([
  {
    "$match": {
      "$expr": {
        $eq: [
          "10-08-2018",
          {
            "$dateToString": {
              "date": "$creationDate",
              "format": "%m-%d-%Y"
            }
          }
        ]
      }
    }
  }
])

看到它正常工作here

如果要查找与日期范围匹配的记录集:

db.getCollection('articles').aggregate([
  {
    "$match": {
      "$expr": {
        "$and": [
          {
            "$gte": [
              "$creationDate",
              {
                "$dateFromString": {
                  "dateString": "10-08-2018",
                  "format": "%m-%d-%Y"
                }
              }
            ]
          },
          {
            "$lte": [
              "$creationDate",
              {
                "$dateFromString": {
                  "dateString": "11-08-2018",
                  "format": "%m-%d-%Y"
                }
              }
            ]
          }
        ]
      }
    }
  }
])

看到它正常工作here

第2个示例的一个注意事项是它将日期作为ISO日期,因此不会涵盖当天结束的日期11/08/2018,但 2018-11-08T00: matthPen评论指出的00:00.000Z

答案 1 :(得分:0)

即使@Akrion答案返回示例,也无法正确过滤日期。以全局方式,最好尽可能多地处理日期,而不是转换为字符串。一个简单的示例:使用您的格式(“%m-%d-%Y”),Date(“ 10-08-2018”)> Date(“ 12-01-2017”),但是在字符串比较方面,“ 10-08-2018” << / strong>“ 12-01-2017”。在这种情况下,唯一的工作格式是%Y-%m-%d。

无论如何,mongoDB在聚合框架中提供了一些运算符,以正确处理日期。这是按天匹配的查询:

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $and: [
          {
            $eq: [
              {
                $year: new Date("2018-10-08")
              },
              {
                $year: "$creationDate"
              }
            ]
          },
          {
            $eq: [
              {
                $month: new Date("2018-10-08")
              },
              {
                $month: "$creationDate"
              }
            ]
          },
          {
            $eq: [
              {
                $dayOfMonth: new Date("2018-10-08")
              },
              {
                $dayOfMonth: "$creationDate"
              }
            ]
          }
        ]
      }
    }
  }
])

您可以尝试here

对此查询进行日期范围调整可能会比较棘手,但是以下查询将完成此任务。您可以here.

对其进行测试
db.collection.aggregate([
  {
    $match: {
      $expr: {
        $and: [
          {
// Start date definition, included ($gte)
            $or: [
              {
                $and: [
                  {
                    $eq: [
                      {
                        $year: new Date("2018-10-08")
                      },
                      {
                        $year: "$creationDate"
                      }
                    ]
                  },
                  {
                    $eq: [
                      {
                        $month: new Date("2018-10-08")
                      },
                      {
                        $month: "$creationDate"
                      }
                    ]
                  },
                  {
                    $gte: [
                      {
                        $dayOfMonth: "$creationDate"
                      },
                      {
                        $dayOfMonth: new Date("2018-10-08")
                      }
                    ]
                  }
                ]
              },
              {
                $and: [
                  {
                    $eq: [
                      {
                        $year: "$creationDate"
                      },
                      {
                        $year: new Date("2018-10-08")
                      }
                    ]
                  },
                  {
                    $gte: [
                      {
                        $month: "$creationDate"
                      },
                      {
                        $month: new Date("2018-10-08")
                      }
                    ]
                  },

                ]
              },
              {
                $and: [
                  {
                    $gte: [
                      {
                        $year: "$creationDate"
                      },
                      {
                        $year: new Date("2018-10-08")
                      }
                    ]
                  },

                ]
              }
            ],

          },
     //end date definition, excluded ($lt)
          {
            $or: [
              {
                $and: [
                  {
                    $eq: [
                      {
                        $year: new Date("2018-11-08")
                      },
                      {
                        $year: "$creationDate"
                      }
                    ]
                  },
                  {
                    $eq: [
                      {
                        $month: new Date("2018-11-08")
                      },
                      {
                        $month: "$creationDate"
                      }
                    ]
                  },
                  {
                    $lt: [
                      {
                        $dayOfMonth: "$creationDate"
                      },
                      {
                        $dayOfMonth: new Date("2018-11-08")
                      }
                    ]
                  }
                ]
              },
              {
                $and: [
                  {
                    $eq: [
                      {
                        $year: "$creationDate"
                      },
                      {
                        $year: new Date("2018-10-08")
                      }
                    ]
                  },
                  {
                    $lt: [
                      {
                        $month: "$creationDate"
                      },
                      {
                        $month: new Date("2018-11-08")
                      }
                    ]
                  },

                ]
              },
              {
                $and: [
                  {
                    $lt: [
                      {
                        $year: "$creationDate"
                      },
                      {
                        $year: new Date("2018-11-08")
                      }
                    ]
                  },

                ]
              }
            ],

          }
        ]
      }
    }
  }
])