过滤符合MongoEngine,Django,GraphQl条件的嵌入式文档

7lrncoxx  于 2023-03-20  发布在  Go
关注(0)|答案(1)|浏览(99)

文件结构

数据

class Data(EmbeddedDocument):
    v = FloatField()
    q = StringField()
    co2 = FloatField()
    price = FloatField()
    ts = DateTimeField()

Jmeter 数据

class MetersData(DynamicDocument):
    meta = {'collection': 'dk_heating'}
    _id = ObjectIdField()
    ident = StringField()
    meteringPointId = StringField()
    customer = StringField()
    cvr = StringField()
    type = StringField()
    unit = StringField()
    address = StringField()
    period = EmbeddedDocumentField(Period)
    hourly_data = ListField(EmbeddedDocumentField(Data), db_field='data')
    daily_data = ListField(EmbeddedDocumentField(Data))
    monthly_data = ListField(EmbeddedDocumentField(Data))
    # monthly_data = EmbeddedDocumentListField(Data)
    yearly_data = ListField(EmbeddedDocumentField(Data))

我正在使用此查询。

查询

MetersData.objects.filter(address=address, customer=customer).fields(
                monthly_data={"$elemMatch": {"q": "E"}},
                address=1, customer=1, cvr=1, ident=1, meteringPointId=1, type=1, unit=1, period=1)

它只返回第一个匹配的元素。我读过文档,它说$elemMatch应该只返回第一个匹配的结果。但是在我的例子中,我需要所有的匹配结果。

查询结果

我到处都找遍了,但还是找不到解决办法。

fjnneemd

fjnneemd1#

我使用MongoDB管道修复了这个问题。

pipeline = [
    {
        '$match': {'meteringPointId': {'$in': [1,2,3]}}
    }, {
        '$addFields': {
            'data': {
                '$filter': {
                    'input': '$data',
                    'as': 'data',
                    'cond': {
                        '$and': [
                            {'$gte': [f'$data.ts', from_date]},
                            {'$lt': [f'$data.ts', to_date]}
                        ]
                    }
                }
            }
        }
    }
]

相关问题