PyMongo-通过正则表达式从集合中选择子文档

时间:2016-10-30 16:31:50

标签: python mongodb pymongo

让我们举例说明以下集合:

{
    '_id': '0',
    'docs': [
        {'value': 'abcd', 'key': '1234'},
        {'value': 'abef', 'key': '5678'}
    ]
}
{
    '_id': '1',
    'docs': [
        {'value': 'wxyz', 'key': '1234'},
        {'value': 'abgh', 'key': '5678'}
    ]
}

我希望只能选择' docs'下的子文档。列出哪个'值'包含字符串' ab'。我期待得到的是以下集合:

{
    '_id': '0',
    'docs': [
        {'value': 'abcd', 'key': '1234'},
        {'value': 'abef', 'key': '5678'}
    ]
}
{
    '_id': '1',
    'docs': [
        {'value': 'abgh', 'key': '5678'}
    ]
}

因此,过滤掉不匹配的子文档。

1 个答案:

答案 0 :(得分:0)

您需要一个分别匹配每个子文档的聚合管道,然后将匹配的子文档重新连接到数组中:

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" raw"字符串,以避免使用正则表达式代码的任何问题。在这种情况下,正则表达式只是" ab"所以" r"前缀不是必要的,但它现在是一种很好的做法,所以你以后不会犯错误。