查询 MongoCollection 以获取两个日期字符串之间的数据

问题描述 投票:0回答:1

我尝试创建一个查询来搜索两个日期字符串之间的所有集合,但是我所有的尝试都失败了,每次尝试查询时它总是不返回任何结果

这是我使用的查询:

const intialDate = new Date('2024-05-23T06:00:00.000Z');
const endDate = new Date('2024-05-24T20:44:02.172Z');

const dispoquery = this.guestModel.find({
  $and: [
    {
      $or:[
        {
          initial: {
          $gte: intialDate
          }
        },
        {
          end: {
          $lte: endDate
          }
        },
      ]
    }
  ]
}).catch((err) => {
  return err;
})
.then((doc:any)=> {
      return doc
      })

我需要符合此分类的所有文件:

intial >= intialDate || end <= endDate 

但我总是没有结果 这是我收集的样本数据:

{
  "folio": "W1013",
  "nombre": "CArlos",
  "llegada": "2024-05-23T06:00:00.000Z",
  "salida": "2024-05-24T19:52:11.050Z",
  "__v": 0
}

有人可以告诉我我做错了什么吗?

javascript mongodb express mongoose
1个回答
0
投票

您的数据和查询存在一些问题:

  1. 您的查询有单词

    initial
    end
    ,但您的数据库文档
    llegada
    salida

  2. 您的文档的日期为字符串,而不是日期对象。并且您正在与日期对象进行比较,而不是字符串。

    • 因此,要么将其作为字符串比较(不推荐),要么使用
      llegada
      salida
      $dateFromString
      转换为日期。
    • 如果您始终仅对所有日期变量使用UTC,并且所有文档都有代表UTC的日期字符串,那么您可以将其作为字符串比较来进行
    • 但如果可能使用多个时区,那么在查询时用
      $dateFromString
      进行转换
  3. 如果其中只有一个

    $and
    子句,则无需使用
    $or

由于查询时需要对文档数据进行一些转换,因此您需要使用

$expr
进行比较/检查。

db.guestModel.find({
  $expr: {
    $or: [
      {
        $gte: [
          { $dateFromString: { dateString: "$llegada" } },
          new Date("2024-05-23T06:00:00.000Z")
        ]
      },
      {
        $lte: [
          { $dateFromString: { dateString: "$salida" } },
          new Date("2024-05-24T20:44:02.172Z")
        ]
      }
    ]
  }
})

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.