Имате нужда от конвейер за агрегиране, който съвпада с всеки поддокумент поотделно, след което отново обединява съответстващите поддокументи в масиви:
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 Collection. Това извежда:
[{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" не е необходим, но сега е добра практика, за да не правите грешка в бъдеще.