【问题标题】:cursor bug with limit in pymongo?pymongo中有限制的光标错误?
【发布时间】:2013-08-21 00:11:25
【问题描述】:

我有一个包含 5 行的集合,但我需要选择一个:

for row in db.foo.find({},{"_id":1}).limit(1).sort("_id",-1):print row

结果:

{u'_id': 4}

但是,当计数光标时

flag=db.foo.find({},{"_id":1},limit=1).sort("_id",-1)
print flag.count()

结果=5

flag=db.foo.find({},{"_id":1},limit=1).sort("_id",-1).count() 结果:5

有人知道为什么会这样吗?

MongoDB shell 版本:2.4.4

pymongo.version '2.5.1+'

【问题讨论】:

  • count() 忽略了limit(<num>),这就是计数结果为 5 的原因。
  • 但先找到后数,是否相等? @AbhishekKumar
  • 因为db.foo.find({},{"_id":1},limit=1).sort("_id",-1).count()和后面添加count()的查询是一样的。即使cur=db.foo.find({},{"_id":1},limit=1), cur.sort("_id",-1), cur.count() 也会给出相同的结果。只有在您遍历游标时才会触发查询。因此,您可以在任何步骤中装饰您的光标(但必须在迭代之前)。希望它有所帮助。
  • 但是在附加 count() 时,查询仅在那个时刻被触发,正如我从 mongostat 看到的那样。
  • 谢谢!!! @AbhishekKumar

标签: mongodb pymongo


【解决方案1】:

count 默认忽略 skiplimit 您可以通过设置 with_limit_and_skip 标志来更改此设置,例如:

flag = db.foo.find({}, {"_id":1}, limit=1).sort("_id", -1)
print flag.count(with_limit_and_skip=True)

【讨论】:

  • 当我搜索时,只找到一个,但是当 .count() 光标结果为 5 时,不要指望找到,只有结果...
  • 如果你想让它考虑你的跳跃和限制,你必须做一个 .count(with_limit_and_skip=True) 。虽然,如果你限制了为什么不投到一个列表并做一个 len。 flag = list(db.foo.find({}, {"_id":1}, limit=1).sort("_id", -1))print len(flag)
猜你喜欢
  • 2012-05-12
  • 2018-04-14
  • 2018-10-30
  • 2020-08-14
  • 2013-07-29
  • 2016-06-04
  • 2013-07-06
  • 2023-03-19
  • 2016-11-17
相关资源
最近更新 更多