我在一些 mongoengine 的文档中有一个所需的权限列表,我想对其进行过滤。
考虑这个文件:
class Entry(Document):
required_perms = ListField(StringField())
e = Entry(required_perms=['create', 'update'])
e.save()
以下是一些用例:
all_perms = ['create', 'update', 'delete']
Entry.objects.filter(required_perms__in=all_perms)
[<Entry: Entry object>] # Returned because 'create' OR 'update' are in required_perms
Entry.objects.filter(required_perms__in=['create', 'delete'])
[<Entry: Entry object>] # Returned because 'create' is in required_perms
Entry.objects.filter(required_perms__all=all_perms)
[] # Not returned because 'delete' is not in required_perms
使用 查询时$in
,我得到Entry
, 因为至少有一个字符串在列表中。$all
不满足我的需求,因为根据文档,这与我打算做的相反:“提供的值列表中的每个项目都在数组中”;我想:“数组中的每个项目都在提供的值列表中”。
所以,我想要求这样的事情:
Entry.objects.filter(everyoneof__required_perms__in=['create', 'delete'])
我欺骗了这个来清楚地解释它,但这很丑陋,不是动态的,不应该使用:
Entry.objects(Q(required_perms__0__in=all_perms) & Q(required_perms__1__in=all_perms))
"""
Can be tested with: all_perms = ['create', 'delete'] -> No results
and: all_perms = ['create', 'update', 'delete'] -> 1 result
"""
有没有办法做这样的事情?也许有一个原始查询?