【问题标题】:retrieve all whose `date` is within last 6 minutes检索所有“日期”在过去 6 分钟内的人
【发布时间】:2021-09-25 20:28:46
【问题描述】:

我在 MongoDB 中存储了一个 Product 集合。它有一个属性date

const productSchema = new mongoose.Schema<ProductAttrs>({
    date: {
        type: Date, 
        required: true,
    }
    ...
})

我想检索与当前时间相比,date 在最近 6 分钟内的所有产品。在猫鼬中检索它的有效方法是什么?

我在我的项目中使用 express.js + typescript + mongoose v5.11。

【问题讨论】:

    标签: node.js typescript mongodb express mongoose


    【解决方案1】:

    您必须使用 Mongoose 搜索所有时间大于now - 6 minutes 的记录。
    我没有办法测试它,但查询应该是这样的:

    const sixMinutes = (6*60*1000); // 6 minutes
    let sixMinutesAgo = new Date();
    sixMinutesAgo.setTime(sixMinutesAgo.getTime() - sixMinutes);
    
    const products = Product.find({ 
      date: {
            $gte: sixMinutesAgo
            }
      })
    

    【讨论】:

    • 太简单了,真让我丢脸... +1 应得的 ;)
    【解决方案2】:

    如果您的 MongoDB 服务器版本是 5.0,您可以使用新的运算符 $dateDiff。在这种情况下,它非常方便,您甚至不需要aggregate

    db.collection.find({
      "$expr": {
        "$lte": [
          {
            "$dateDiff": {
              startDate: "$date",
              endDate: new Date(),
              unit: "minute"
            }
          },
          6
        ]
      }
    })
    

    它允许您指定unit 字段,我认为这使得查询非常简单。

    $expr 计算表达式并返回 truefalse,仅此而已。如果表达式结果为真,则返回该行,否则不返回。

    $lte 表示小于或等于&lt;= 运算符),仅当第一个参数小于或等于第二个运算符时才返回true。基本上,这就是它在伪代码中所做的:

    foreach doc in collection
        if (minute)(currentDate - document.date) <= 6 then
            return document
    

    【讨论】:

    • 谢谢,你能解释一下$expr$lte关键字是什么吗?对不起,我是 MongoDB 的新手。
    • @pasine 的答案应该是被接受的。
    • 是的,:) 非常直接。但也很高兴听到您的解决方案!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    相关资源
    最近更新 更多