亲爱的尝试在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
答案 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")
}
]
},
]
}
],
}
]
}
}
}
])