Mongodb 每个文档包含3个带日期的字段,是否可以根据这些字段中最接近今天的日期返回文档?
我有一个结构如下的数据库:Mongodb 每个文档包含3个带日期的字段,是否可以根据这些字段中最接近今天的日期返回文档?,mongodb,Mongodb,我有一个结构如下的数据库: { "bidding":"0ABF3", "dates":{ "expiration_date_registration":ISODate("2020-08-24T23:51:25.000Z"), "expiration_date_tender":ISODate("2020-08-23T23:51:25.000Z&q
{
"bidding":"0ABF3",
"dates":{
"expiration_date_registration":ISODate("2020-08-24T23:51:25.000Z"),
"expiration_date_tender":ISODate("2020-08-23T23:51:25.000Z"),
"expiration_date_complaints":ISODate("2020-08-22T23:51:25.000Z")
}
},
{
"bidding":"0ABF4",
"dates":{
"expiration_date_registration":ISODate("2020-08-19T23:51:25.000Z"),
"expiration_date_tender":ISODate("2020-07-25T23:51:25.000Z"), // this is the closest expiration date with respect to today ("this question was asked on July 24)
"expiration_date_complaints":ISODate("2020-08-13T23:51:25.000Z")
}
}
我有3个字段,每个字段包含一个日期<代码>截止日期\注册,截止日期\投标
,截止日期\投诉
我希望当向我的数据库发出请求时,它会根据这3个字段中包含的日期按过期日期的顺序返回
在这种情况下,输出应该首先显示第二个文档(在本例中,它是日期最接近今天的字段(该问题在7月24日提出),“到期日期”投标:ISODate(“2020-07-29T25:51:25.000Z”)
)等等,使用这3个字段确定我的文档显示顺序的顺序
有可能吗?您可以使用$subtract查找今天日期($currentDate)和“到期日期\u tender”之间的差异,然后使用$sort将所需文档放在顶部。您可以使用collection.findOne()函数获取顶部文档,这是可能的,但效率不高。这里有一个聚合管道,它计算每个日期从现在开始的距离,然后按最小距离获取和排序
伟大的朋友,最后一件事,在保存每个对象时,我如何在每个对象中输入最接近今天的日期(ISO格式)?例如,在第一个对象中,最接近今天的日期是
expiration\u date\u registration
我想知道如何以ISO格式返回此日期的值,因为它是保存的。您可以使用这样的$switch将距离映射到日期值。但它变得有点笨拙。因此,这是一个使用数组索引的更干净的替代方法
db.collection.aggregate([
{
$addFields: {
datesArr: [
"$dates.expiration_date_registration",
"$dates.expiration_date_tender",
"$dates.expiration_date_complaints",
]
}
},
{
$addFields: {
distances: {
$map: {
input: "$datesArr",
in: {
$abs: {
$subtract: [
"$$NOW",
"$$this"
]
}
}
}
}
}
},
{
$addFields: {
minDist: {
$min: "$distances"
}
}
},
{
$addFields: {
closestDate: {
$let: {
vars: {
closestDateIndex: {
$indexOfArray: [
"$distances",
"$minDist"
]
}
},
in: {
$arrayElemAt: [
"$datesArr",
"$$closestDateIndex"
]
}
}
}
}
},
{
$sort: {
minDist: 1
}
}
])