将变量传递给MongoDB查询

时间:2015-11-16 06:38:37

标签: python mongodb mongodb-query pymongo aggregation-framework

我的馆藏有以下文件

{
  cust_id: "0044234",
  Address: "1234 Dunn Hill",
  city: "Pittsburg",
  comments : "4"
},

{
  cust_id: "0097314",
  Address: "5678 Dunn Hill",
  city: "San Diego",
  comments : "99"
},

{
  cust_id: "012345",
  Address: "2929 Dunn Hill",
  city: "Pittsburg",
  comments : "41"
}

我想编写一个代码块来提取和存储来自同一城市的所有cust_id。我可以通过在MongoDB上运行以下查询来获得答案:

db.custData.find({"city" : 'Pittsburg'},{business_id:1}). 

但是,我无法使用Python做同样的事情。以下是我的尝试:

ctgrp=[{"$group":{"_id":"$city","number of cust":{"$sum":1}}}]
myDict={}
for line in collection.aggregate(ctgrp) : #for grouping all the cities in   the dataset
    myDict[line['_id']]=line['number of cust']
for key in myDict:
    k=db.collection.find({"city" : 'key'},{'cust_id:1'})
    print k
client.close()

另外,我无法弄清楚如何存储它。我脑海中唯一想到的是一个字典,其中包含与特定“键”对应的“值列表”。但是,我无法想出相同的实现。我正在寻找像这样的输出

对于Pitssburg,值为0044234和012345。

1 个答案:

答案 0 :(得分:0)

您可以使用.distinct方法,这是执行此操作的最佳方法。

import pymongo
client = pymongo.MongoClient()
db = client.test
collection = db.collection

然后:

collection.distinct('cust_id', {'city': 'Pittsburg'})

收率:

['0044234', '012345']

或做这个效率不高的客户端:

>>> cust_ids = set()
>>> for element in collection.find({'city': 'Pittsburg'}):
...     cust_ids.add(element['cust_id'])
... 
>>> cust_ids
{'0044234', '012345'}

现在,如果你想要所有" cust_id"对于某个城市来说,这是

 >>> list(collection.aggregate([{'$match': {'city': 'Pittsburg'} }, {'$group': {'_id': None, 'cust_ids': {'$push': '$cust_id'}}}]))[0]['cust_ids']
['0044234', '012345']

现在,如果你想要的是按城市分组你的文件,那么在这里找到不同的" cust_id"那么就是这样:

>>> from pprint import pprint
>>> pipeline = [{'$group': {'_id': '$city', 'cust_ids': {'$addToSet': '$cust_id'}, 'count': {'$sum': 1}}}]
>>> pprint(list(collection.aggregate(pipeline)))
[{'_id': 'San Diego', 'count': 1, 'cust_ids': ['0097314']},
 {'_id': 'Pittsburg', 'count': 2, 'cust_ids': ['012345', '0044234']}]
相关问题