为pymongo的remove设置justOne限制器时出现TypeError

0 投票
1 回答
735 浏览
提问于 2025-04-18 04:33

在 Python 2.7.3 和 pymongo 2.7 的环境下

我正在尝试在从 pymongo 的集合中删除文档时设置 justOne 安全限制器

ufo.users 指向一个有效的、已经初始化的集合。

>>> type(ufo.users)
<class 'pymongo.collection.Collection'>    

>>> ufo.users.remove({'emails.address': 'foo@bar.com'}, {'justOne': True})                                                                                                            
Traceback (most recent call last):                                                                                                                                                    
  File "<stdin>", line 1, in <module>                                                                                                                                                 
  File "/home/action/.local/lib/python2.7/site-packages/pymongo/collection.py", line 645, in remove                                                                                   
    safe, options = self._get_write_mode(safe, **kwargs)                                                                                                                              
  File "/home/action/.local/lib/python2.7/site-packages/pymongo/common.py", line 693, in _get_write_mode                                                                              
    validate_boolean('safe', safe)                                                                                                                                                    
  File "/home/action/.local/lib/python2.7/site-packages/pymongo/common.py", line 75, in validate_boolean                                                                              
    raise TypeError("Wrong type for %s, value must be a boolean" % (option,))                                                                                                         
TypeError: Wrong type for safe, value must be a boolean

把 justOne 的值设置为 'True'、'true'、1 或 '1',都会出现同样的错误信息。

查看我本地的包缓存时,我发现了 pymongo/common.py 中应该负责验证的函数:

def validate_boolean(option, value):                                                                                                                                                  
    """Validates that 'value' is 'true' or 'false'.                                                                                                                                   
    """                                                                                                                                                                               
    if isinstance(value, bool):                                                                                                                                                       
        return value                                                                                                                                                                  
    elif isinstance(value, basestring):                                                                                                                                               
        if value not in ('true', 'false'):                                                                                                                                            
            raise ConfigurationError("The value of %s must be "                                                                                                                       
                                     "'true' or 'false'" % (option,))                                                                                                                 
        return value == 'true'                                                                                                                                                        
    raise TypeError("Wrong type for %s, value must be a boolean" % (option,))                                                                                                         

但是……我不太明白。我尝试传递 'true' 和 True……

这是这个包里的一个 bug 吗?

我需要怎么做才能正确设置 justOne 选项呢?

1 个回答

3

在使用pymongo的时候,参数有点不同,具体可以参考文档

ufo.users.remove({'emails.address': 'foo@bar.com'}, safe=True)

这样做就可以解决问题了

撰写回答