MongoDB按Email查询交易记录及获取Credit交易的技术问题
问题1:通过Email查询MongoDB交易记录的错误修复
错误原因
你使用的findById()方法是专门针对MongoDB文档的_id字段(ObjectId类型)进行查询的,而你传入的是字符串格式的邮箱地址,类型不匹配导致了Cast to ObjectId failed的错误。要查询所有匹配该邮箱的交易记录,需要使用find()方法(返回多条记录)。
修正后的代码
const router = require("express").Router(); const Transaction = require("../models/Transactions"); 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!" }); } // 替换findById为find,根据email字段查询所有匹配记录 const trans = await Transaction.find({ email: req.params.email }); res.status(200).json(trans); } catch (error) { res.status(404).json({ message: error.message }); } }); module.exports = router;
注意:需确保你的Transactions模型中定义了email字段,且存储的是字符串类型的邮箱地址,才能保证查询匹配。
问题2:获取所有credit类型的交易记录
根据你的数据库字段结构,分两种常见场景处理:
场景1:通过交易类型字段查询
如果你的交易模型中有type字段用来标识交易类型(例如值为credit或debit),直接按该字段查询:
const Transaction = require("../models/Transactions"); async function getCreditTransactions() { try { const creditTransactions = await Transaction.find({ type: "credit" }); return creditTransactions; } catch (error) { console.error("获取贷记交易失败:", error); throw error; } }
场景2:通过credit金额字段查询
如果credit字段存储的是贷记交易的金额(借记交易的credit字段为空或0),可查询credit字段有效(非空且大于0)的记录:
const Transaction = require("../models/Transactions"); async function getCreditTransactions() { try { const creditTransactions = await Transaction.find({ credit: { $exists: true, $gt: 0 } }); return creditTransactions; } catch (error) { console.error("获取贷记交易失败:", error); throw error; } }
如果要在Express路由中使用,只需将上述查询逻辑替换问题1中的查询代码即可。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

