【问题标题】:MongoDB - Error handling for non-existent fieldMongoDB - 不存在字段的错误处理
【发布时间】:2012-12-03 20:49:20
【问题描述】:

我有一个集合,其中包含每个文档的一组字段值。其中之一称为“坐标”。现在,当我在数据库中查询该字段不为空的元素时,它会返回我期望的正确值。

但是我偶尔在 python (Pymongo) 中遇到这个错误:

if not doc['coordinates']
TypeError: 'NoneType' object has no attribute '__getitem__'

这似乎暗示它遇到了一个没有字段“坐标”的记录。我已经创建了包含该字段的文档并且应该存在。

不过我想知道,我该如何处理这个错误并防止这个错误终止我的程序。

这就是我找到适当查询的方式:

 cursor = collection.find(
                { "$and" : [
                    {"term": {"$in": events}}, 
                    { "$or" : [
                            {"coordinates" : {"$ne": None}}, 
                            {"place" : {"$ne" : None}}
                    ]}
                ]}, 
            {"term" : 1, "coordinates" : 1, "place" : 1, "time_normal" : 1}, tailable = True, timeout = False )

然后我遍历返回的查询,如下:

while cursor.alive:
    try:
        doc = cursor.next()

        CODE IS HERE TO QUERY DB


    except StopIteration:
        pass

谢谢

【问题讨论】:

    标签: python mongodb python-2.7 pymongo


    【解决方案1】:

    我能够通过在异常块中包含 TypeError 来处理此错误,如下所示:

                    try:                                               
                        if not doc['coordinates']:
                            CODE HERE
    
                        else: 
                            CODE HERE
    
                    except (TypeError):
                        pass
    

    【讨论】:

      【解决方案2】:

      Eric 是对的,出于某种原因,您的文档是 None。您能否在此处发布您用于 find 的代码以及如何处理从 find 返回的光标?

      【讨论】:

      • 嗨,我已经用请求的代码片段更新了我的原始问题
      • 我无法用您的代码重现该错误。也许你试试:对于光标中的文档: foo=doc.get("coordinates")
      【解决方案3】:

      您在示例中获得 TypeError 和在 nickmilon 提供的示例中获得 AttributeError 的原因是因为您用于获取 doc 的查询没有找到任何内容(因此NoneType)。检查您的查询以确保您确实从您的收藏中获取了内容。

      不过,nickmilon 提供的答案应该为您提供您所追求的错误处理。

      【讨论】:

      • 谢谢,是的,查询正在返回文档。在这种情况下,它将在遇到此错误之前返回数百个文档。那么会不会是它击中了一个没有坐标字段的文档?
      • 我将在上面提到@nickmilion,并建议您尝试使用for 循环而不是while 循环。似乎它也可能使代码更容易理解。
      【解决方案4】:

      你可以试试: doc.get('coordinates') 如果字段不存在则返回 None ,如果存在则返回值

      【讨论】:

      • 如果我尝试它仍然给我一个类似的错误:如果不是 doc.get('coordinates'): AttributeError: 'NoneType' object has no attribute 'get'
      猜你喜欢
      • 2021-10-27
      • 2021-03-20
      • 2021-03-05
      • 2018-08-12
      • 1970-01-01
      • 2021-02-28
      • 2011-05-02
      • 1970-01-01
      • 2022-08-04
      相关资源
      最近更新 更多