MongoDB / Mongoose返回空数组

时间:2017-04-16 22:44:24

标签: node.js mongodb mongoose

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

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。

3 个答案:

答案 0 :(得分:1)

它做的事情与你想象的不同。

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

这真的是给我数组,其中包含集合"Job"中所有文件,其中"jobID"字段等于某个值

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

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

当您将JobID更改为_id时,我不知道为什么会出错。究竟是什么错误?

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

答案 1 :(得分:0)

当您尝试通过__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);
    }
  });
});

编辑:我没有意识到你检查过错误,我改变了代码。

答案 2 :(得分:0)

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

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

_id带来的错误必须是无关紧要的,可能是由于查询无效。