You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:14:10