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
    }
  }
])