【问题标题】:Query MongoDB with custom date String - javascript使用自定义日期字符串查询 MongoDB - javascript
【发布时间】:2021-11-09 21:05:06
【问题描述】:

我是NodeJS 的新手。我在MongoDB 中有一个集合,其中包含如下所示的Data

[{
        _id: new ObjectId("6180c67a9b414de991a24c43"),
        cusDate: '20/11/2021 03:32 AM',
        cusName: 'Akila',
        cusEmail: 'akila@gmail.com',
        __v: 0
    },
    {
        _id: new ObjectId("6180c67a9bt14de991a24c43"),
        cusDate: '02/08/2021 08:12 AM',
        cusName: 'Booth',
        cusEmail: 'booth@gmail.com',
        __v: 0
    },
    {
        _id: new ObjectId("u180c67a9b414de991a24c43"),
        cusDate: '12/07/2020 11:38 AM',
        cusName: 'Sam',
        cusEmail: 'sam@gmail.com',
        __v: 0
    }, {
        _id: new ObjectId("61y0c67a9b414de991a24c43"),
        cusDate: '22/01/2021 07:42 AM',
        cusName: 'Ram',
        cusEmail: 'ram@gmail.com',
        __v: 0
    },
]

我想根据cusDateCollection 查找并获取数据。

fromCusDate: 01/06/2020 12:00 AM
toCusDate: 01/03/2021 12:00 PM

所需输出:

[
    {
        _id: new ObjectId("u180c67a9b414de991a24c43"),
        cusDate: '12/07/2020 11:38 AM',
        cusName: 'Sam',
        cusEmail: 'sam@gmail.com',
        __v: 0
    }, {
        _id: new ObjectId("61y0c67a9b414de991a24c43"),
        cusDate: '22/01/2021 07:42 AM',
        cusName: 'Ram',
        cusEmail: 'ram@gmail.com',
        __v: 0
    },
]

我的cusDate 是字符串数据类型。字符串日期格式为DD/MM/YYYY hh:mm A

这是我尝试过的代码,

let getOrdersData = await collection.find({ "cusDate": { "$gte": "01/06/2020 12:00 AM", "$lt": "01/03/2021 12:00 PM" } })

但我的日期是 String collection 中的数据类型。所以我无法获取该数据。

我不知道如何获取这些数据。我想知道 Mongoose 查询来获取这些数据。

let getOrdersMonth = await collection.find({ "cusDate": { "$gte": "01/06/2020 12:00 AM", "$lt": "01/03/2021 12:00 PM" } })

我找到了这个答案。 stackoverflow answer。但它是一个 mongodb 查询。我需要一个猫鼬查询。我搜索了stackoverflow,但找不到任何答案。请帮我解决一些问题。

【问题讨论】:

  • 从你找到的mongodb版本答案中适配mongoose版本的时候有遇到什么具体问题吗? AFAIK,convert mongodb native aggregation to mongoose 应该不费吹灰之力。您能否分享您当前的尝试以及您遇到的具体错误,以便我们更好地了解?
  • 我需要一个猫鼬查询来实现这一点。我的日期是字符串类型。我试过这个。 await Collection.find({ "cusDate": { "$gte": new Date("01/11/2021 12:00 PM") } })。我没有数据。计数为 0。
  • 你可以在这里找到这个问题的答案:stackoverflow.com/questions/2943222/…
  • mongoose 只是一个定义数据模型的框架。它 mongodb,查询是相同的——可能除了await 命令。
  • 您应该永远将日期/时间值存储为字符串,这是一个设计缺陷。始终正确存储 Date 对象。根据$dateFromString 的说法,MongoDB 本身不支持“AM/PM”12 小时格式,因此您必须使用 3rd 方库或编写自己的复杂函数。不妨试试moment.js 库,它支持解析几乎任何格式的日期值。

标签: javascript node.js mongodb express


【解决方案1】:

要在 MongoDB 中使用日期查询来解决这个问题,首先需要在 MongoDB 集合中有一个 Date 类型的条目。类似于 createdAt、updatedAt 的东西。使用 Mongo 查询日期更容易,但相同的逻辑不适用于字符串,它必须是 Date 类型。

因此,在您的模型中,您可以定义另一个条目,例如 newCusDate,在其中获取 cusDate 并使用 new Date(cusDate) 将其转换为日期。但这需要在定义集合时发生。 然后,您可以使用 MongoDB 在 Date 上使用一堆查询。

let gtDate = new Date('some date string here');
let ltDate = new Date('some date string here');

let getOrdersMonth = await collection.find({
  "newCusDate": {
    "$gte": gtDate,
    "$lt": ltDate
  }
})

它们都是日期对象(数据类型)非常重要。

【讨论】:

  • 正确的陈述,但不是问题的真正答案。
猜你喜欢
  • 1970-01-01
  • 2014-07-09
  • 2018-04-06
  • 1970-01-01
  • 2017-01-10
  • 2023-02-16
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多