MongoDB查询技术问询:如何通过QR的ObjectId查找其所属的QrBlock
解决通过QR的ObjectId查询所属QrBlock的问题
先帮你揪出原代码里的问题:你用了{ qr: { "qr.$": id } }这个查询条件,这里的qr.$是MongoDB的位置操作符,它只能在更新操作里定位数组中匹配元素的位置,完全不能用来写查询条件——这就是你拿不到预期结果的核心原因。
接下来分两种常见场景,给你整理正确的查询方式:
场景1:QrBlock的qr字段是单个ObjectId引用
如果你的QrBlock模型里,qr字段是直接存储单个QR的ObjectId(不是数组),那查询逻辑非常简单,直接匹配这个ObjectId就行:
qrRoute.post("/scanQr", (req, res) => { let { data } = req.body; const qrId = mongoose.Types.ObjectId(data); Qr.findById(qrId) .exec() .then((qrr) => { // 直接匹配qr字段等于目标ObjectId return QrBlock.find({ qr: qrId }).exec(); }) .then((qrBlocks) => { console.log(qrBlocks); res.status(200).json(qrBlocks); // 别忘了给前端返回结果 }) .catch((err) => { console.error(err); res.status(500).json({ error: err.message }); // 处理异常情况 }); });
场景2:QrBlock的qr字段是ObjectId数组
如果qr字段是存储多个QR ObjectId的数组,MongoDB支持直接用{ qr: qrId }匹配数组中包含该id的文档,你也可以用$in操作符(语义更明确,效果一致):
qrRoute.post("/scanQr", (req, res) => { let { data } = req.body; const qrId = mongoose.Types.ObjectId(data); Qr.findById(qrId) .exec() .then((qrr) => { // 方式1:直接匹配数组包含目标id // return QrBlock.find({ qr: qrId }).exec(); // 方式2:用$in显式声明数组查询 return QrBlock.find({ qr: { $in: [qrId] } }).exec(); }) .then((qrBlocks) => { console.log(qrBlocks); res.status(200).json(qrBlocks); }) .catch((err) => { console.error(err); res.status(500).json({ error: err.message }); }); });
额外优化建议
原代码里QrBlock.find混用了回调函数和Promise链,容易陷入回调地狱,推荐改成更简洁的async/await风格:
qrRoute.post("/scanQr", async (req, res) => { try { let { data } = req.body; const qrId = mongoose.Types.ObjectId(data); const qrr = await Qr.findById(qrId).exec(); const qrBlocks = await QrBlock.find({ qr: qrId }).exec(); console.log(qrBlocks); res.status(200).json(qrBlocks); } catch (err) { console.error(err); res.status(500).json({ error: err.message }); } });
这样代码可读性更高,后续维护也更方便。
内容的提问来源于stack exchange,提问作者Ziya Karagöz
相关产品推荐
相关产品推荐

