Mongoengine 聚合不像 mongo

Mongoengine aggregate doesn't work like mongo

我有一个 Mongo 文档,里面有一个嵌入式文档列表(示例如下)。我正在尝试 运行 一个聚合,该聚合将 return 仅包含列表中匹配对象的完整文档。

示例集合数据

{
    "make": "Toyota",
    "color": "blue",
    "tires": [{
        "make": "Mishlen",
        "size": 185
    }, {
        "make": "Mishlen",
        "size": 210
    }]
}

我设法通过以下查询使其在 MongoDB 中工作

db.cars.aggregate(
    [
        {
            $match: {$and: [{"tires.size": {$gt: 200}}]}
        },
        {
            $addFields: {
                "tires": {
                    $filter: {
                        input: '$tires',
                        as: 'tires',
                        cond: {$gt: ['$$tires.size', 200]}
                    }
                }
            }
        },
        {
            $limit: 100
        },
        {
            $skip: 0
        }
])

我正在尝试 运行 mongoengine 中的相同聚合,但它每次都是 return 一个空列表。

pipeline = [
    {
        "$match": {"$and": [{"tires.size": {"$gt": 200}}]}
    },
    {
        "$addFields": {
            "tires": {
                "$filter": {
                    "input": "$tires",
                    "as": "tires",
                    "cond": {"$and": [{"$gt": ["$$tires.size", 200]}]}
                }
            }
        }
    }
]
self.obj_type.objects.aggregate(*pipeline)

我做错了什么?

更新

我的问题比我想象的要简单得多,我错过了我在 python 中将数字作为字符串而不是 int 传递。感谢大家的帮助

下面的工作流程是最简单的

 pipeline = [
            {
        $unwind: "$tires"
            },
            {
                "$match": {"$and": [{"tires.size": {"$gt": 200}}]}
            },
            {
         $group : { 
                   _id : "$make", 
                   tires: { $push: "$tires" } 
                  }
            } 

        ]
        self.obj_type.objects.aggregate(*pipeline) 

插入您提供的示例文档后,我对 运行 使用您提供的管道进行聚合没有任何特殊问题。见下文:

class Tire(EmbeddedDocument):
    make = StringField()
    size = IntField()

class Car(Document):
    make = StringField()
    color = StringField()
    tires = EmbeddedDocumentListField(Tire)

    meta = {'collection': 'cars'}

pipeline = [
    {
        "$match": {"$and": [{"tires.size": {"$gt": 200}}]}
    },
    {
        "$addFields": {
            "tires": {
                "$filter": {
                    "input": "$tires",
                    "as": "tires",
                    "cond": {"$and": [{"$gt": ["$$tires.size", 200]}]}
                }
            }
        }
    }
]

# Verify aggregation pipeline runs fine with the driver (pymongo)
coll = Car._get_collection()
pymongo_result = list(coll.aggregate(pipeline))
assert len(pymongo_result) == 1

# Run same aggregation pipeline with MongoEngine
mongoengine_result = list(Car.objects.aggregate(*pipeline))
assert len(mongoengine_result) == 1

result = [
    {'_id': ObjectId('5e0a5c8e7c57cd9b300710fb'),
     'color': 'blue',
     'make': 'Toyota',
     'tires': [{'make': 'Mishlen', 'size': 210.0}]
    }
]
assert mongoengine_result == pymongo_result == result

我使用了最新的 mongoengine 版本,但据我所知,最近 MongoEngine 的聚合包装器没有重大变化。问题可能出在您的 self.obj_type.objects 中,请像我一样尝试使用新的查询集(即 YourDocumentClass.objects),看看它是否有所作为。