各サブドキュメントを個別に照合し、一致するサブドキュメントを配列に再結合する集約パイプラインが必要です。
from pprint import pprint
from bson import Regex
regex = Regex(r'ab')
pprint(list(col.aggregate([{
'$unwind': '$docs'
}, {
'$match': {'docs.value': regex}
}, {
'$group': {
'_id': '$_id',
'docs': {'$push': '$docs'}
}
}])))
「col」はPyMongoコレクションオブジェクトを指す変数だと思います。この出力:
[{u'_id': u'1',
u'docs': [{u'key': u'5678', u'value': u'abgh'}]},
{u'_id': u'0',
u'docs': [{u'key': u'1234', u'value': u'abcd'},
{u'key': u'5678', u'value': u'abef'}]}]
文字列の「r」プレフィックスは、正規表現コードの問題を回避するために、Pythonの「生の」文字列になります。この場合、正規表現は単に「ab」であるため、「r」プレフィックスは必要ありませんが、将来間違えないように、今は良い習慣です。