Joh*_*etz 5 python dictionary mongodb pymongo aggregation-framework
我在MongoDB集合中有以下4个字典favoriteColors:
{ "name" : "Johnny", "color" : "green" }
{ "name" : "Steve", "color" : "blue" },
{ "name" : "Ben", "color" : "red" },
{ "name" : "Timmy", "color" : "cyan" }
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个与不同有序列表匹配的颜色值的ORDERED列表.
例如,如果我有列表["Johnny", "Steve", "Ben", "Johnny"],新列表将["green", "blue", "red", "green"].
如果我有列表["Steve", "Steve", "Ben", "Ben", "Johnny"],新列表将是["blue", "blue", "red", "red", "green"].
使用Python和/或PyMongo这样做的好方法是什么.这是我到目前为止所做的,但它没有认识到重复.
name_list = ["Steve", "Steve", "Ben", "Ben", "Johnny"]
color_list = []
for document in db.favoriteColors.aggregate([
{"$match": {"name": {"$in": name_list }}},
{"$project": {"color": 1}}
]):
for k, v in document.iteritems():
color_list.append(v)
print color_list
# ["blue", "red", "green"]
Run Code Online (Sandbox Code Playgroud)
实际上,我们可以使用带有客户端处理的聚合框架来有效地做到这一点。
import pymongo
client = pymongo.MongoClient()
db = client.test # Or whatever is your database
favoriteColors = db.favoriteColors
first_list = ['Johnny', 'Steve', 'Ben', 'Johnny']
cursor = favoriteColors.aggregate([
{'$match': {'name': {'$in': first_list}}},
{'$project': {'part': {'$map': {
'input': first_list,
'as': 'inp',
'in': {
'$cond': [
{'$eq': [ '$$inp', '$name']},
'$color',
None
]
}
}}}},
{'$group': {'_id': None, 'data': {'$push': '$part'}}}
])
Run Code Online (Sandbox Code Playgroud)
因为我们$group使用 None,所以我们的光标包含一个我们可以使用 检索的文档next。事实上我们可以用以下方式验证这一点print(list(cursor))
>>> import pprint
>>> pprint.pprint(list(cursor))
[{'_id': None,
'data': [['green', None, None, 'green'],
[None, 'blue', None, None],
[None, None, 'red', None]]}]
Run Code Online (Sandbox Code Playgroud)
从这里开始,我们需要使用 解压文档中的“数据”字段zip,使用 链接输入chain.from_iterable并过滤掉 的元素None。
from itertools import chain
result = [item
for item in chain.from_iterable(zip(*next(cursor)['data']))
if item is not None]
Run Code Online (Sandbox Code Playgroud)
返回:
>>> result
['green', 'blue', 'red', 'green']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
257 次 |
| 最近记录: |