【问题标题】:Mongoengine list filteringMongoengine 列表过滤
【发布时间】:2012-10-23 15:30:12
【问题描述】:

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

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

【问题讨论】:

    标签: python mongodb-query mongoengine


    【解决方案1】:

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

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

    如果订单不固定或不知道,那么您可以使用$all 运算符:

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

    更新

    如果您必须确保列表中的所有元素都符合给定的要求,并且它们可能存在也可能不存在 - 这是不支持的。你必须做一个__in=,然后在你的应用程序中过滤。

    我不确定这种方法。为什么要担心用户拥有额外的权限?听起来不太灵活/面向未来。

    【讨论】:

    • 谢谢罗斯,但这只有在给定的列表正是保存的列表时才有效。用这个查询不会返回任何结果,例如:Entry.objects.filter(required_perms=['create', 'update', 'delete'])
    • 已使用 all 运算符的示例更新了答案 - 应该按照您的需要进行。
    • 不幸的是,不是。我还更新了用例,希望有更具体的解释。感谢您花时间在这上面!
    • 我明白了...事实上,我有一个通用对象列表,具有所需权限的用户应该可以访问这些对象(每个对象的权限可能会有所不同)。我认为存储所需的权限是最好的解决方案,以便可以在数据库级别进行过滤。谢谢大家,我会检查另一种方法。
    • 在这种情况下,$all 不是确保用户拥有获取对象所需的所有权限的最佳解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多