Necesita una canalización de agregación que coincida con cada subdocumento por separado, luego vuelva a unir los subdocumentos coincidentes en matrices:
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'}
}
}])))
Supongo que "col" es una variable que apunta a su objeto PyMongo Collection. Esto genera:
[{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'}]}]
El prefijo "r" de la cadena la convierte en una cadena "en bruto" de Python para evitar cualquier problema con el código regex. En este caso, la expresión regular es simplemente "ab", por lo que el prefijo "r" no es necesario, pero ahora es una buena práctica para no cometer un error en el futuro.