mongodb count()和python builtin len()之间有区别吗

时间:2012-10-06 15:04:46

标签: python mongodb pymongo

似乎我使用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 

2 个答案:

答案 0 :(得分:2)

您的两个查询使用“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

答案 1 :(得分:2)

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

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

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

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

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