You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Node.js和MongoDB获取最新日期的交易记录?

问题

我希望从MongoDB数据库中优先获取最新的交易数据,但当前查询得到的数据并非最新交易。

现有路由代码

router.get("/get-transactionby-email/:email", async (req, res) => {
  try {
    if (
      !req.headers.authorization ||
      !req.headers.authorization.startsWith("Bearer ") ||
      !req.headers.authorization.split(" ")[1]
    ) {
      return res.status(422).json({ message: "Please Provide Token!" });
    }
    const trans = await Transaction.find({ email: req.params.email });
    res.status(200).json(trans);
  } catch (error) {
    res.status(404).json({ message: error.message });
  }
});

router.get("/get-credit-transaction/:email", async (req, res) => {
  try {
    if (
      !req.headers.authorization ||
      !req.headers.authorization.startsWith("Bearer ") ||
      !req.headers.authorization.split(" ")[1]
    ) {
      return res.status(422).json({ message: "Please Provide Token!" });
    }
    const trans = await Transaction.find(
      { email: req.params.email , debit : 0.00 },
      { narration: true, credit: true, amount: true }
    );
    res.status(200).json(trans);
  } catch (error) {
    res.status(404).json({ message: error.message });
  }
});

模型结构

const mongoose = require("mongoose");

const transactionSchema = new mongoose.Schema({
  email: {
    type: String,
    required:true,
    max: 255,
  },
  narration: {
    type: String,
    required:true,
    max: 255,
  },
  credit: {
    type: mongoose.SchemaTypes.Number,
    required:true,
  },
  debit: {
    type: mongoose.SchemaTypes.Number,
    required:true,
  },
  amount: {
    type: mongoose.SchemaTypes.Number,
    required:true,
  },
  created_at: {
    type: Date,
    default: Date.now(),
  },
});

module.exports = mongoose.model('Transactions',transactionSchema);

解决方案

第一步:修复created_at的默认值问题

当前模型里created_at的默认值用了Date.now(),这会导致所有新创建的文档都使用Schema定义时的固定时间,而非文档创建的实时时间。需要改成Date.now(不带括号),Mongoose会在每次创建文档时自动调用这个方法生成当前时间:

const transactionSchema = new mongoose.Schema({
  // 其他字段保持不变
  created_at: {
    type: Date,
    default: Date.now, // 去掉括号
  },
});

第二步:查询时添加排序逻辑

在find()方法后链式调用.sort({ created_at: -1 }),-1表示按created_at字段降序排列,最新的交易记录会排在返回结果的最前面。

修改后的路由代码:

router.get("/get-transactionby-email/:email", async (req, res) => {
  try {
    if (
      !req.headers.authorization ||
      !req.headers.authorization.startsWith("Bearer ") ||
      !req.headers.authorization.split(" ")[1]
    ) {
      return res.status(422).json({ message: "Please Provide Token!" });
    }
    // 添加排序,按created_at降序
    const trans = await Transaction.find({ email: req.params.email }).sort({ created_at: -1 });
    res.status(200).json(trans);
  } catch (error) {
    res.status(404).json({ message: error.message });
  }
});

router.get("/get-credit-transaction/:email", async (req, res) => {
  try {
    if (
      !req.headers.authorization ||
      !req.headers.authorization.startsWith("Bearer ") ||
      !req.headers.authorization.split(" ")[1]
    ) {
      return res.status(422).json({ message: "Please Provide Token!" });
    }
    // 添加排序,按created_at降序
    const trans = await Transaction.find(
      { email: req.params.email , debit : 0.00 },
      { narration: true, credit: true, amount: true }
    ).sort({ created_at: -1 });
    res.status(200).json(trans);
  } catch (error) {
    res.status(404).json({ message: error.message });
  }
});

修改完成后,查询返回的交易数据会按时间从新到旧排列,优先获取最新的交易记录。

内容的提问来源于stack exchange,提问作者Pamela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:05:32