MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

PyMongo- selecionando subdocumentos da coleção por regex


Você precisa de um pipeline de agregação que corresponda a cada subdocumento separadamente e, em seguida, reúna os subdocumentos correspondentes em matrizes:
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'}
    }
}])))

Suponho que "col" seja uma variável apontando para o seu objeto PyMongo Collection. Isso produz:
[{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'}]}]

O prefixo "r" para a string a torna uma string "raw" do Python para evitar qualquer problema com o código regex. Nesse caso, o regex é apenas "ab", então o prefixo "r" não é necessário, mas é uma boa prática agora para que você não cometa erros no futuro.