【问题标题】:MongoEngine python library filter query get native mongo syntaxMongoEngine python库过滤器查询获取本机mongo语法
【发布时间】:2020-07-03 23:01:22
【问题描述】:

过滤mongoengine python库提供的mongo查询以连接到MongoDB有不同的方法。我们可以使用不同的Query operators

但这是 MongoEngine 的实现,MongoDB 无法理解,mongoengine 必须将其转换为 MongoDB 原生语法可以理解的语法。

例如:

model.objects(field__in=[1])

是 MongoDB 中的实际查询

db.collection.find({field: {$in: [1]}})

models.objects(field__lt=5)

是 MongoDB 中的实际查询

db.collection.find({field: {$lt: 5}})

我正在寻找可以传递field__in=[1] 并返回给我{field: {$in: [1]}} 的方法。

我需要这个来生成聚合$match。 MongoEngine model.objects.aggregate 将返回pymongo.command_cursor.CommandCursor 对象,它不支持QuerySet 支持的过滤方式,我不能像model.objects.aggregate(XXXX)(field__in=[1]) 那样做。

我可以model.objects(field__in=[1]).aggregate(XXX) 但这是错误的,我们在聚合之前进行过滤,但我想对聚合数据进行过滤。

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

    mongoengine 中有一个方法可以提供这个。

    from mongoengine.queryset.transform import query
    

    如果不提供来源Document,结果将非常通用。

    >> query(title="hello")
    {'title': 'hello'}
    
    >> query(title__contains="hello")
    {'title': 'hello'}
    

    如果您定义 Document 并将其提供给查询,则每种字段类型都会知道如何正确处理查询:

    >> from mongoengine import Document, fields
    
    >> class Test(Document):
    >>    title = fields.StringField()
    
    >> query(Test, title="hello")
    {'title': 'hello'}
    
    >> query(Test, title__contains="hello")
    {'title': re.compile(r'hello', re.UNICODE)}
    

    【讨论】:

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