0

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

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 
4

2 回答 2

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
于 2012-10-06T22:22:24.043 回答
2

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

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

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

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

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

于 2012-10-06T22:30:48.313 回答