sql >> Base de Datos >  >> NoSQL >> MongoDB

PyMongo:selección de subdocumentos de la colección por expresiones regulares

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.