【问题标题】:Mongo engine query the referencefieldMongo引擎查询参考字段
【发布时间】:2015-08-22 12:11:25
【问题描述】:

我已经定义了类声明:

from mongoengine import *
class TickDataDocument(Document):
"""
"""
    instrument_id = StringField(max_length=10, unique=True, required=True)
    tick_data = ReferenceField(TickDocument)


class TickDocument(Document):
"""
"""
    price = DecimalField(precision=2, required=True) 
    volume = LongField(required=True)  
    turnover = DecimalField(precision=2, required=True)  
    update_time = DateTimeField(unique=True, required=True)

我想查询某个时间段的update_time。

 TickDataDocument.objects(instrument_id="fa1100").filter(tick_data__ update_time__lt =datetime.datetime(2013,9,3))

但我得到错误:

mongoengine.errors.InvalidQueryError:无法在 mongoDB 中执行连接: tick_data__update_time

我怎样才能找到五种解决方案来查询 mongoengine 中的内部引用字段。

【问题讨论】:

  • 你能做两个不同的查询吗?首先获取tickdatadocuments并在tickDocument中查询这些文档?

标签: python mongodb django-mongodb-engine


【解决方案1】:

正如评论中所建议的,我分两个步骤(两个查询):

tick_docs = list(TickDocument.object(update_time__lt)=datetime.datetime(2013,9,3))

TickDataDocument.objects(instrument_id="fa1100").filter(tick_data__in=tick_docs)

如果有更简单的解决方案,我也很感兴趣。

【讨论】:

  • 这是唯一的方法吗?如果TickDocument 的行数过多,可能会出现内存问题。
  • @Hide 是的,看看我的回答
【解决方案2】:

您可以在 mongoengine 中使用 aggregate 方法并使用 $lookup 语法进行连接和查询,请注意使用聚合方法返回的是游标对象,而不是 QuerySet。

示例

TickDataDocument.objects().aggregate([
    {"$match":{"instrument_id":"fa1100"}},
    {"$lookup":{
        "from": TickDocument._get_collection_name(),
        "localField": "tick_data",
        "foreignField": "_id",
        "as": "tick"            
    }},
    {"$match":{
        "tick.update_time":{"$lt":datetime.datetime(2013,9,3)}
    }}
])

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2013-02-22
    • 2019-10-10
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多