MongoDB中替代Cursor.count()的方法及报错解决问询
解决MongoDB Cursor无count_documents属性的问题
我来帮你理清这个问题的根源,然后直接给你可行的解决方案!
为什么会报错?
你遇到的核心问题是搞混了**集合(Collection)和游标(Cursor)**的方法:
- 原来的
things.count()里,things是db['stuffs'].find(...)返回的游标对象,MongoDB驱动已经废弃了游标上的count()方法; - 官方推荐的
count_documents()是集合对象的方法(也就是db['stuffs']这个对象),不是游标对象的,所以直接在游标上调用肯定会报“没有这个属性”的错误。
你的原代码问题
看一下你的代码:
def stuff(x): return db['stuffs'].find({"stuff": x}) def check_for_stuff(x): things = stuff(x) if not things.count(): return None
这里things是游标,所以不管是调用旧的count()还是尝试调用count_documents()都会出问题。
解决方案1:直接用集合的count_documents(推荐)
既然只是要判断数据是否存在,直接在集合上调用count_documents统计符合条件的文档数就行,不需要先创建游标:
def check_for_stuff(x): # 直接在集合上统计数量 doc_count = db['stuffs'].count_documents({"stuff": x}) if doc_count == 0: return None # 如果需要返回查询到的数据,再创建游标返回 return db['stuffs'].find({"stuff": x})
这是官方推荐的方式,性能和兼容性都更好。
解决方案2:如果需要保留游标,判断是否有数据
如果你确实需要先拿到游标,又想判断是否有结果,可以通过尝试获取第一个文档来判断(不需要统计总数):
def check_for_stuff(x): things = stuff(x) try: # 尝试获取第一个文档,没有数据会抛出StopIteration异常 first_item = next(things) # 如果你需要完整的游标(包含第一个文档),可以重新查询一次 # 这里简单返回游标即可,因为已经确认有数据了 return things except StopIteration: return None
这个方法适合不需要知道具体数量,只需要判断“有没有”的场景,比统计总数更高效。
为什么你之前加collection没用?
你可能误解了count_documents的调用对象——它是集合对象(db['stuffs'])的方法,不是给游标加个collection属性就能用的。必须直接操作集合,而不是游标。
内容的提问来源于stack exchange,提问作者Raksha
相关产品推荐
相关产品推荐

