Anda memerlukan saluran agregasi yang cocok dengan setiap subdokumen secara terpisah, lalu menggabungkan kembali subdokumen yang cocok ke dalam larik:
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'}
}
}])))
Saya berasumsi "col" adalah variabel yang menunjuk ke objek Koleksi PyMongo Anda. Ini menghasilkan:
[{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'}]}]
Awalan "r" ke string menjadikannya string "mentah" Python untuk menghindari masalah dengan kode regex. Dalam hal ini regex hanya "ab" sehingga awalan "r" tidak diperlukan, tetapi ini praktik yang baik sekarang agar Anda tidak membuat kesalahan di masa mendatang.