【问题标题】:MongoDB/Mongoose returning empty arrayMongoDB/Mongoose 返回空数组
【发布时间】:2017-09-12 13:35:41
【问题描述】:

我目前正在使用 mongodb/mongoose 开展一个项目,每次我故意查询数据库中不存在的内容时,我都会收到一个空数组的响应。这是我使用 Express 设置 API 并返回在数据库中找到的数据的代码:

app.get('/api/:id', function(req, res) {
var id = req.params.id;
Job.find({jobID: id}, function (err, foundJob) {
    if (err) {
        console.log(err);
    }
    else {
        res.json(foundJob);
    }
  });
});

但是,每次我去 localhost:3000/api/67 (我在数据库中还没有 jobID: 67 的对象)时,控制台都不会打印错误。它给了我一个带有空数组的 JSON 响应。关于为什么会发生这种情况的任何想法?奇怪的是,当我将jobID: id 更改为_id: id 时,它确实给了我一个错误。为什么它不对jobID 字段执行此操作?

编辑:澄清一下,我不希望这种行为的原因是因为我的程序永远不会打印错误,即使我的数据库中的作业不存在指定的 jobID。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    返回空字符串是 mongoose 的正常行为。您应该这样处理您的回复:

    if (err) {
        //handle error
    } else if (foundJob) {
        //work with your data
    } else {
        //nothing was found
    }
    

    您使用 _id 得到的错误一定是无关紧要的,可能是由于查询无效。

    【讨论】:

    • 通过说相同的结果你到底是什么意思?即使您的数组为空,您是否进入 else if(foundJob){}?
    【解决方案2】:

    它的作用与你想象的不同。

    Job.find({jobID: id}, ... )
    

    真正的意思是给我一个数组,其中包含集合"Job" 中的所有文档,其中字段"jobID" 等于某个值

    如果没有这样的文件怎么办?好吧,那么数组将为空。当然,没有任何错误,这里应该是什么错误?您要求提供所有文档(给定一些过滤器)并返回包含所有此类文档的数组。数组的大小为零只是巧合,因为没有这样的文档。

    如果要检查是否没有该文档,则检查数组是否为空。

    我不知道为什么将JobID 更改为_id 时会出现错误;究竟是什么错误?

    如果您只对一个文档感兴趣,那么有一个方法 findOne 只返回第一个文档(如果不存在此类文档,则返回 null)而不是数组。

    【讨论】:

    • 谢谢!您的解释帮助我更了解它,然后我添加了这个条件语句来修复它: else if (!res.length){ console.log("Nothing found"); }
    【解决方案3】:

    关于当你试图通过它的 __id 查找某些东西时出错:它会给你一个错误,因为 __id 不是 String,它是 ObjectId。因此,您应该像这样搜索具有该 __id 的文档:_id: ObjectId(id)


    关于空字符串:如果您想显示某种不同的消息,您应该检查 db 是否返回了某些内容,或者返回的是空字符串。像这样的:

    app.get('/api/:id', function(req, res) {
    var id = req.params.id;
    Job.find({jobID: id}, function (err, foundJob) {
        if(foundJob){
           res.json(foundJob);
        }else{
           res.json("nothing found");
        }
    if (err) {
            console.log(err);
        }
      });
    });
    

    编辑:我没有意识到您检查了错误,我更改了代码。

    【讨论】:

    • 这产生了与以前相同的结果:/
    • @calviners 我第三次编辑它。这应该 100% 有效。
    猜你喜欢
    • 2019-08-18
    • 2021-09-17
    • 1970-01-01
    • 2013-12-17
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多