【问题标题】:is there difference between mongodb count() and python builtin len()mongodb count() 和 python builtin len() 之间有区别吗
【发布时间】:2012-09-27 11:25:15
【问题描述】:

似乎我使用 mongodb count() 和 python len() 得到了 2 个不同的结果

db.users.find({"adresse.coord":{"$within":{"$center":[[4.365041,36.743954],100]}}}).distinct("produit_up") 
Out[17]: 
[{u'avatar': {u'avctype': u'image/jpeg', 
u'orientation': u'portrait', 
u'photo': ObjectId('506f2ee93a5f3a0528ab8621')}, 
u'spec': {u'abus': 0, 
u'date': u'2012-10-05', 
u'description': u'brrrrrrrrrrr', 
u'id': u'tofla134946378579', 
u'namep': u'nokia 6230', 
u'nombre': 2, 
u'prix': 1000, 
u'tags': [u'nokia', u'6230', u'photo'], 
u'vendu': False}}, 
{u'avatar': {u'avctype': u'image/jpeg', 
u'orientation': u'portrait', 
u'photo': ObjectId('506867863a5f3a0ea84dcd6c')}, 
u'spec': {u'abus': 0, 
u'date': u'2012-09-30', 
u'description': u"portable tr\xe8s solide, peu servi, avec batterie d'une autonomie de 3 heures.", 
u'id': u'alucaard134901952647', 
u'namep': u'nokia 3310', 
u'nombre': 1, 
u'prix': 1000, 
u'tags': [u'portable', u'nokia', u'3310'], 
u'vendu': False}}, 
{u'avatar': {u'avctype': u'image/jpeg', 
u'orientation': u'portrait', 
u'photo': ObjectId('506f2b3e3a5f3a0b3c4731a9')}, 
u'spec': {u'abus': 0, 
u'date': u'2012-10-05', 
u'description': u'bzzzzzzzzzz', 
u'id': u'alucaard134946284638', 
u'namep': u'nokia 6230', 
u'nombre': 1, 
u'prix': 2000, 
u'tags': [u'nokia', u'nok', u'noki'], 
u'vendu': False}}] 

db.users.find({"adresse.coord":{"$within":{"$center":[[4.365041,36.743954],100]}}}).count() 
Out[18]: 2 

len(db.users.find({"adresse.coord":{"$within":{"$center":[[4.365041,36.743954],100]}}}).distinct("produit_up")) 
Out[19]: 3 

【问题讨论】:

  • 后者不同——distinct()在最后,是故意的吗?
  • 它应该给我 3 个结果,但计数忽略了一个结果,那为什么会这样呢?
  • 我首先认为您的意思是标准内置序列.count() 方法,仅基于您的问题标题。 :-P
  • “produit_up”是嵌入到文档中的数组吗?
  • 每个文档有一个吗?看起来您的查询匹配两个文档,但它们之间具有三个不同的“produit_up”值。为什么你认为这不一致?返回 3 的两个查询相同,返回 2 的查询不同。

标签: python mongodb pymongo


【解决方案1】:

您的两个查询使用“distinct”,但第三个没有 - 它只使用 count()。我不希望不同类型的查询得到相同数量的结果。

考虑这个学生集合示例:

{name:"joe", class: ["biology","math"]}
{name:"jane", class: ["math", "english"]}

db.students.find().count()    
2
db.students.find().distinct("class")
["biology","math","english"]
len(db.students.find().distinct("class"))
3

【讨论】:

  • 啊,谢谢!所以他们是两个不同的查询!因为我认为当结果得到 Python 时,这一切都是 Python 的方式!
  • @AbdelouahabPp:不要忘记使用Cursor 对象,您可以继续添加更多的ORM 命令,例如distinctcount。查询仅在您开始从迭代器评估其值时执行。
  • @AbdelouahabPp:就像我在回答中所说,如果您不需要文件,count 会更有效。在来自服务器的响应中必须处理的工作和数据要少得多。
  • 啊!因为是初学者,所以我的工作方式如下:我进行查询,然后我使用字典/列表操作来尝试提取我想要的数据,我正在制作一个简单的电子商务项目,当我完成时我会分享它:)再次感谢你:)
【解决方案2】:

mongodb .count() 将执行服务器端查询,仅请求匹配的文档总数。它在查询中发送计数命令。 MongoDB 只会向您的客户端驱动程序返回一个 int。

使用 python len() 将对 mongodb 查询返回的文档数进行客户端计数。这意味着您正在从数据库中接收完整的文档,并在本地对其进行操作。

如果你只需要知道计数,那么第一个效率更高,因为结果更快更小。

如果您打算使用生成的文档并且还想知道计数,则将查询结果保存到变量中,并使用len() 检查其大小。这样您就不必执行两个查询来获取计数 + 实际文档。

这是您关于它们用法之间差异的问题的主要答案。正如其他人所指出的,您正在比较的查询本身是不同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2012-02-16
    • 2015-12-16
    相关资源
    最近更新 更多