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

Node.js操作MongoDB:按指定ObjectId和post查询文档始终返回存在

问题分析与修复方案

我来帮你梳理下代码里的几个关键问题,这就是为什么你总是得到"Available"的原因:

1. find()方法的回调参数理解错误

MongoDB的find()方法返回的是游标对象,不是直接的查询结果文档。不管数据库里有没有匹配的数据,这个游标对象都会存在,所以你的if(doc)判断永远为真,自然一直返回"Available"。

如果你只是要检查是否存在匹配的文档,更适合用findOne()方法,它会直接返回匹配的第一个文档,没有匹配的话就返回null。

2. _id查询条件构建错误

你已经创建了uId = { _id: new ObjectId(req.body.uId) },但在find()的查询条件里又写成了{_id: uId, postId:pId}。这相当于你在查询_id等于{_id: ObjectId("xxx")}的文档,而不是_id等于ObjectId("xxx")的文档,这完全不符合你的预期,肯定匹配不到正确的数据。

3. 数据库连接关闭时机不当

你把client.close()放在了else分支里,如果进入if(doc)分支,连接就不会被关闭,长此以往会造成数据库连接泄漏。应该确保无论查询结果如何,都要关闭连接。


修正后的代码示例

我用findOne()重构了你的代码,解决了上述所有问题:

router.post('/check', (req, res) => {
  const MongoClient = require('mongodb').MongoClient;
  const ObjectId = require('mongodb').ObjectID; // 把依赖声明移到顶部更规范
  
  MongoClient.connect(dburl, { useNewUrlParser: true }, (err, client) => {
    if (err) {
      console.log("Error: " + err);
      return res.send("Database connection error"); // 错误时也要返回响应
    }

    const uId = new ObjectId(req.body.uId);
    const pId = req.body.pId;
    const collect = client.db('Example').collection('Wishlist');

    // 使用findOne直接获取匹配文档,无匹配则返回null
    collect.findOne({ _id: uId, postId: pId }, (err, doc) => {
      client.close(); // 无论结果如何,先关闭连接
      if (err) {
        console.log("Error: " + err);
        return res.send("Query error");
      }
      if (doc) {
        res.send("Available");
      } else {
        res.send("Not available");
      }
    });
  });
});

另外,建议你把依赖声明(比如MongoClient和ObjectId的require)移到文件顶部,这样代码结构更清晰,也符合Node.js的编码规范。

内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:06:15