Mongoengine列表过滤

时间:2012-10-23 15:30:13

标签: mongoengine mongodb-query

我在一些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
"""

有没有办法做那样的事情?也许有原始查询?

感谢。

1 个答案:

答案 0 :(得分:2)

如果您知道订单,那么您可以直接检查,例如:

Entry.objects.filter(required_perms=['create', 'delete'])

如果订单未修复或已知,则您可以使用$all运算符:

Entry.objects.filter(required_perms__all=['create', 'delete'])

更新

如果您必须确保列表中的所有元素都符合给定的要求,并且它们可能存在或不存在 - 则不受支持。您必须执行__in=,然后在您的应用程序中进行过滤。

我不确定这个方法。为什么担心用户有额外的权限?听起来不太灵活/未来证明。