基于字典域密钥存在的Mongoengine/MongoDB模型过滤

2024-04-24 01:11:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Mongoengine构建一个数据模型,为电子邮件文件存储一些metada。非常精简的模型,只有与我的问题相关的字段,是:

class Email(Document):
    headers = DictField()

headers字典将包含从电子邮件中提取的标题数据,这些邮件以键值关系工作。你知道吗

在我知道的这个头数据中,有时会出现一个头,其名称(和字典键):x-mailer(所有头键都是自动小写的)。我构建了一个简单的查询,以查看标头是否包含如下键:

xmailer_emails = Email.objects.filter(headers__exists='x-mailer')

然而,这个结果并不包含email集合中的所有条目,但是它包含了很多在headers字典中没有x-mailer作为键的条目。下面是我用来检查结果数据的一些代码:

xmailer_emails = Email.objects.filter(headers__exists='x-mailer'))
log(xmailer_emails._query)

log('Total email count: ' + str(Email.objects.count()))
log('X-Mailer email acount: ' + str(xmailer_emails.count()))

no_xmailer = len([e for e in xmailer_emails if 'x-mailer' not in e.headers])
log('Filtered no x-mailer count: ' + str(no_xmailer))

has_xmailer = len([e for e in xmailer_emails if 'x-mailer' in e.headers])
log('Filtered has x-mailer count: ' + str(has_xmailer))

下面是我得到的结果:

[21:32:54 05/27/19] {'headers': {'$exists': 'x-mailer'}}
[21:32:54 05/27/19] Total email count: 86
[21:32:54 05/27/19] X-Mailer email count: 79
[21:32:54 05/27/19] Filtered no x-mailer count: 55
[21:32:54 05/27/19] Filtered has x-mailer count: 24

因此,虽然集合中有86个条目,但它会在headers中的x-mailer过滤器上收回其中的79个条目。从中筛选出只有24个在字典中实际具有该键值。我好像做错了什么,但我不知道是什么。你知道吗

下面是一些它还收回的不包含x-mailer键的项目的简短转储,这些是键:

dict_keys(['x-receiver', 'to', 'mime-version', 'received', 'x-priority', 'x-sender', 'date', 'content-type', 'message-id', 'subject', 'x-riferimento-message-id', 'from'])
dict_keys(['content-type', 'mime-version'])
dict_keys(['x-wum-to', 'date', 'x-uidl', 'message-id', 'in-reply-to', 'x-wum-replyto', 'x-message-delivery', 'mime-version', 'received', 'x-savecopy', 'authentication-results', 'x-wum-nature', 'x-account-key', 'x-wum-from', 'message-context', 'x-originalarrivaltime', 'x-me-spamrating', 'x-me-spamlevel', 'to', 'x-dkim-result', 'x-mozilla-status', 'x-mozilla-status2', 'references', 'x-auth-result', 'x-store-info', 'return-path', 'x-message-info', 'x-sid-pra', 'x-message-status', 'sender', 'x-wum-cci', 'content-type', 'reply-to', 'subject', 'from'])
dict_keys(['x-ms-has-attach', 'to', 'mime-version', 'received', 'thread-topic', 'x-auto-response-suppress', 'x-ms-exchange-organization-authsource', 'content-language', 'content-type', 'date', 'subject', 'message-id', 'thread-index', 'reply-to', 'from'])

我搞不清楚发生了什么,虽然exists操作符起作用,但它也包括不匹配的文档,但不是集合中的所有文档。你知道吗

我在mongoengine存储库中也提出了这个问题,但没有回答(除了exists操作符的一个链接SO问题外):https://github.com/MongoEngine/mongoengine/issues/2059


Tags: toinlogmessagemaileremailcountexists
1条回答
网友
1楼 · 发布于 2024-04-24 01:11:09

您实际需要执行的pymongo查询如下:

c.find({'headers.x-mailer': {'$exists': True}})

如果您有简单的密钥(例如“xmailer”而不是“x-mailer”),您可以在mongoengine中通过以下方法实现这一点: Email.objects.filter(headers__xmailer__exists=True))

但可以使用原始运算符来实现:

Email.objects.filter(__raw__={'headers.x-mailer': {'$exists': True}})

相关问题 更多 >