【问题标题】:MongoEngine: Building a filter queryMongoEngine:构建过滤器查询
【发布时间】:2021-03-19 13:53:20
【问题描述】:

我想构建一个过滤器查询,当我调用通用过滤器函数('filter_it('username', ' =', 'test_user')。

最简单的例子:

# grab the user, apply filter
result = User.objects().filter(username="test_user")
# print result
print(result.get())

返回:

test_user

现在如果我尝试使用变量:

# set query
query = 'username="test_user"'
# grab the user, apply filter
result = User.objects().filter(query)
# print result
print(result.get())

返回:

mongoengine.errors.InvalidQueryError: Not a query object: username="test_user". Did you intend to use key=value?

我曾尝试使用raw queries 构建它,但未能成功。我也尝试过使用 .format() 无济于事。似乎custom queryset 可能会解决问题,但不能以我想要的方式应用。

有没有人有任何建议、想法或解释?我认为问题在于将字符串作为查询对象传递,但我似乎无法在 mongoengine 文档中找到解释或替代方法。

【问题讨论】:

    标签: python-3.x mongoengine


    【解决方案1】:

    In order to build advanced queries you must use a Q object.

    Q 对象允许您使用和/或运算符 (&/|) 构建复杂的查询。

    例如:

    from mongoengine import Q
    
    
    # set query
    query = Q(username="test_user")
    # grab the user, apply filter
    result = User.objects()(query)
    # print result
    print(result.get())
    

    结果

    test_user
    

    我们也可以这样做:

    # set query
    query = str("test_user")
    # grab the user, apply filter
    result = User.objects()(username=query)
    # print result
    print(result.get())
    

    结果

    test_user
    

    据我所知,不可能使用变量来定义正在搜索的字段。

    这失败了:

    # set field
    field = "username"
    # set query
    query = str("test_user")
    # grab the user, apply filter
    result = User.objects()(field=query)
    # print result
    print(result.get())
    

    结果

    mongoengine.errors.InvalidQueryError: Cannot resolve field "field"
    

    每个变体都失败了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 2013-12-27
      相关资源
      最近更新 更多