如何用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
相关产品推荐
相关产品推荐

