优化双循环//在python或mongodb中进行选择

时间:2013-10-30 22:45:54

标签: python mongodb pymongo

我有一个结构

locations : { //info,
             "events" :[ { //data
                          "displayed" : True},
                          { //data
                          "displayed" : False}
                       ]
             }

每个位置都有许多事件,我们定义是否显示事件。

我的python代码:

#load the data
locations = db.col.find({'events.displayed': True})
#remove manually
for l in locations:
    for e in l['events']:
        if e['displayed'] == False:
            #this item should be deleted
            print e

我知道如果{'events.displayed': True}只有events.displayed为真,就可以满足find(),并且它会返回整个项目。

我想询问我是否可以在我的"displayed" : False中忽略那些"displayed" : False的项目。如果用pymongo不能发生这种情况,我想用python手动删除带有{{1}}的项目,在优化的(因为双循环)方式(也许是用itertools库?)。

2 个答案:

答案 0 :(得分:0)

好吧,您只能使用MongoDB的Aggregation Framework获取"displayed": True项。这是一个示例代码。

db.locations.aggregate([{'$unwind': '$events'}, {'$match': {'events.displayed': True}}])

使用db.locations.find,您必须在Python代码上过滤这些元素。

答案 1 :(得分:0)

使用“projection”告诉服务器只发送数组的匹配部分:

for doc in locations.find(
        {'events.displayed': True},
        {'events': {'$elemMatch': {'displayed': True}}}):
    print doc

请注意,这仅返回第一个匹配的数组元素。如果你需要所有匹配的元素,你的Python循环是最好的方法。