如何将 mongodb 聚合管道转换为聚合查询

问题描述 投票:0回答:2

将 json 管道转换为 Aggify 查询

这是我的管道,我如何将其转换为 Aggify 查询

我需要使用 aggify 生成器(这是一个 python 包)来简化我的一些查询,以便可以更快地读取它并查询。但我在某些地方遇到了问题,比如这个问题,有点复杂

Aggify:https://github.com/Aggify/aggify


from mongoengine import Document, fields
class DiscussionDocument(Document):
    network_id = fields.ObjectIdField()
    post = fields.ReferenceField('PostDocument', db_field='post_id')
    parent = fields.ReferenceField('self', db_field='parent_id')
    owner = fields.ReferenceField('AccountDocument', db_field='owner_id')
    body = fields.StringField()
    stat = fields.EmbeddedDocumentField(DiscussionStat)
    is_pinned = fields.BooleanField()
    weight = fields.IntField()
    deleted_at = fields.LongField()

    meta = {
        'collection': 'discussion',
        'indexes': ['post', 'parent', 'owner', 'deleted_at'],
        'ordering': ['-_id']
    }

pipeline = [
                {
                    '$match': {
                        'owner_id': ObjectId(account_id)
                    }
                }, {
                    '$lookup': {
                        'from': 'discussion',
                        'let': {
                            'id': '$_id'
                        },
                        'pipeline': [
                            {
                                '$match': {
                                    '$expr': {
                                        '$and': [
                                            {
                                                '$eq': [
                                                    '$parent_id', '$$id'
                                                ]
                                            }, {
                                                '$ne': [
                                                    '$owner_id', ObjectId(account_id)
                                                ]
                                            }
                                        ]
                                    }
                                }
                            }
                        ],
                        'as': 'replies'
                    }
                }
            ]
mongodb aggregate
2个回答
1
投票
aggify = Aggify(DiscussionDocument)

query = aggify.filter(owner=ObjectId(account_id)).lookup(
    DiscussionDocument,
    let=["id"],
    query=[Q(parent_id="id") & Q(owner_id=ObjectId(account_id))],
    as_name="replies"
)

要添加匹配阶段,您应该使用

filter
方法(如 django),然后使用您的字段名称,Aggify 会将其更改为 db_field 本身。 要添加查找阶段,只需使用
lookup
方法并使用
let
参数来传递 let 值,然后使用
query
参数来编写查询。 在查询中,您可以使用带有所需运算符的
Q
函数或使用
Aggify
对象并添加新管道进行查询。最后,您应该使用
as_name
作为您在此查找中创建的新字段。我希望这对你有帮助。


0
投票

如果您想将原始

Aggregation pipeline
生成为 python 语言。 您可以使用
MongoDB Compass

您可以将原始查询导出为任何语言支持的格式。

JAVA
Python3
NODE
等选项组成

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.