让我们举例说明以下集合:
{
'_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'}
]
}
因此,过滤掉不匹配的子文档。
答案 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"前缀不是必要的,但它现在是一种很好的做法,所以你以后不会犯错误。