【问题标题】:MongoDB Node findone how to handle no results?MongoDB Node findone如何处理没有结果?
【发布时间】:2012-05-20 01:08:24
【问题描述】:

我正在使用带有节点的 npm mongodb 驱动程序。

我有

collection.findOne({query}, function(err, result) {
    //do something
}

问题是说我没有任何结果,err 仍然是null,无论我是否找到结果。我怎么知道查询没有找到结果?

我也试过

info = collection.findOne(....

但是info 只是undefined(它看起来是异步的,所以我不认为这是要走的路……)

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    未找到任何记录不是错误情况,因此您要查找的是 result 中缺少值。由于任何匹配的文档将始终是“真实的”,因此您可以简单地使用简单的if (result) 检查。例如,

    collection.findOne({query}, function(err, result) {
        if (err) { /* handle err */ }
    
        if (result) {
            // we have a result
        } else {
            // we don't
        }
    }
    

    【讨论】:

    • findOne 已弃用
    • @Stepan。那么查询单个文档的最佳方法是什么
    • @Shashank,检查我的答案
    • @StepanYakovenko,谢谢。实际上在看到你的答案之前发表了评论。顺便说一句,我用过。再次感谢。
    • 注意(对于遇到此答案的任何人) findOne() 不再被弃用
    【解决方案2】:

    如果结果为空,则 mongo 未找到与您的查询匹配的文档。是否尝试过 mongo shell 的查询?

    【讨论】:

      【解决方案3】:

      简单来说:

      collection.findOne({query}, function(err, result) {
          if (!result) {
              // Resolve your query here
          }
      }
      

      【讨论】:

        【解决方案4】:
        collection.findOne({query}, function(err, result) {
           if (err) { /* handle err */ }
        
           if (result.length === 0) {
            // we don't have result
           }
        }
        

        【讨论】:

        • result 不是数组,因此在查询与任何记录不匹配的情况下,这只会引发错误(例如,“无法读取未定义的属性'长度'”) .在查询确实匹配记录的情况下,length 仍然不会引用该代码所期望的内容。
        【解决方案5】:

        以下所有这些答案都已过时。 findOne 是deprecated。最新的 2.1 文档建议使用

        find(query).limit(1).next(function(err, doc){
           // handle data
        })
        

        【讨论】:

        • 很高兴知道。但是如果没有结果呢?它是否返回错误或未定义的doc
        • 据我所知,您还可以在迭代完成时添加另一个回调。
        • find().limit() 返回一个 Cursor,其 hasNext() 可用于判断是否有任何匹配的文档。
        • ChrisV 在我之前的回答中提到了这一点,但对于遇到此问题的任何人,请注意 findOne() 不再被弃用。
        • @LukaszWiktor - 我也想知道 - 我找不到任何专门证实这一点的文档,但我认为如果没有结果,它会返回 null
        【解决方案6】:

        现在 - 因为 node 8 - 您可以在 async 函数中执行此操作:

        async function func() {
          try {
            const result = await db.collection('xxx').findOne({query});
            if (!result) {
              // no result
            } else {
              // do something with result
            }
          } catch (err) {
            // error occured
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 2014-12-19
          • 1970-01-01
          • 2021-09-04
          • 1970-01-01
          • 2021-04-20
          • 2017-12-28
          相关资源
          最近更新 更多