【问题标题】:Mongoose return array from find method猫鼬从 find 方法返回数组
【发布时间】:2021-01-21 09:10:05
【问题描述】:

我正在尝试在我的 Mongo 数据库中查询一个集合。我对 Mongo 很陌生(来自 Laravel 和普通的关系数据库),我发现从数据库中获取结果有点挑战。

我有一个名为 cars 的集合,我在该集合中有超过 1,000 个文档,我想返回一组汽车,然后我可以循环或使用传统的 JS 魔法,我正在尝试根据我添加的 created_at 字段返回 3 小时前的一系列汽车....

mongoose.connect(process.env.DB_CONNECTION, { useNewUrlParser: true, useUnifiedTopology: true }, () => console.log('connected'))
const db = mongoose.connection

const threeHoursAgo = moment(new Date()).subtract({hours: 2})
db.collection('cars').find({ 'created_at': { $gte: threeHoursAgo } }).then((res) => {
  console.log(res) // no array items???
})

我的实现似乎并没有给我任何结果,除了一些大的通用对象,它看起来像 Mongo DB 模式,带有 cmd 对象和 options 对象等...

我错过了什么?

另外值得注意的是,我没有数据模型,因为这是切换到 Mongo DB 而不是 SQL 之类的原因之一,所以只需要使用 db.collection() 然后查询这样的东西

【问题讨论】:

    标签: mongodb mongoose momentjs


    【解决方案1】:

    我认为您的查询没有返回任何结果,因为您按原样传递了 moment 对象。您需要使用 .toDate() 将其中包含的日期转换为 Mongo 可以理解的内容,如moment documenation 中所述:

    const threeHoursAgo = moment(new Date()).subtract({hours: 2}).toDate()

    【讨论】:

    • 我的文档的created_at 字段以new Date() 存储返回的任何格式。虽然更新和测试,除了描述的以外,仍然没有给我我的结果。理想情况下,我只想在res 中返回我所有项目的数组,这就是我认为它会做的事情。
    • 那么,您是在自己编写created_at,而不是使用猫鼬的时间戳?如果我遵循正确,那么 created_at 是一个 Date 对象,您将它与 Moment 对象进行比较。看起来您不仅在这里比较对象,而且还在比较不同种类的对象。我在回答中提供的方法应该适用于 createdAt 时间戳(我将它用于我的查询)。如果由于某种原因需要使用 created_at,请在存储变量之前将 .getTime() 添加到变量中
    • 好的,但是即使我放弃基于时间的查询,find() 仍然一无所获,想要一个数组回来
    猜你喜欢
    • 2014-05-30
    • 2020-02-28
    • 1970-01-01
    • 2019-03-25
    • 2016-04-28
    • 2017-03-30
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多