我有一个结构
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库?)。
答案 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循环是最好的方法。