这是我的管道,我如何将其转换为 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'
}
}
]
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
作为您在此查找中创建的新字段。我希望这对你有帮助。
如果您想将原始
Aggregation pipeline
生成为 python 语言。
您可以使用MongoDB Compass
。
您可以将原始查询导出为任何语言支持的格式。
由
JAVA
、Python3
、NODE
等选项组成
希望有帮助。