格式化数据的一个选项是使用
$dateFromString
将这些字符串格式化为正确的日期,以及
$zip
具有
$reverseArray
以正确的顺序将它们配对:
db.collection.aggregate([
{$project: {
endDates: {
$map: {
input: "$endDates",
in: {$dateFromString: {
dateString: "$$this",
format: "%d.%m.%Y"
}}
}
},
startDates: {
$map: {
input: "$startDates",
in: {$dateFromString: {
dateString: "$$this",
format: "%d.%m.%Y"
}}
}
}
}},
{$project: {
dates: {
$zip: {
inputs: [
{$reverseArray: "$startDates"},
{$reverseArray: "$endDates"}
],
useLongestLength: true
}
}
}}
])
看看它是如何在
playground example
现在,如果你想检查一个特定的日期,你可以再添加一个步骤到
$filter
您的数组,并将结果替换为布尔值:
{$project: {
res: {
$toBool: {$size: {
$filter: {
input: "$dates",
cond: {
$and: [
{$gte: [ISODate("2021-12-17T00:00:00Z"), {$first: "$$this"}]},
{$or: [
{$lt: [ISODate("2021-12-17T00:00:00Z"), {$last: "$$this"}]},
{$eq: [{$last: "$$this"}, null]}
]}
]
}
}
}}
}
}}
看看它是如何在
playground example