首页 > 解决方案 > 我想让 MongoEngine Query 只返回我想要的车辆,但它不起作用

问题描述

我正在使用 MongoEngine 创建一个查询,该查询仅返回与约束匹配的车辆。如您所见,车辆是嵌入式文档,所有者是父文档。我的查询是使用Q,查询的结果是不同的,只是与本田品牌和元素型号匹配的车辆。

from mongoengine.queryset.visitor import Q

def get_vehicles():
    vehicles = json.loads(Owner.objects(Q(vehicle__brand='Honda') and Q(vehicle__model='Element')).only('vehicle').to_json())
    return {"vehicles":vehicles} 

class Vehicle(engine.EmbeddedDocument):
    model = engine.StringField(required=True, max_length=50)
    brand = engine.StringField(required=True, max_length=100)
    plates = engine.StringField(required=True, max_length=50)
    year =  engine.IntField(required=True)
    color = engine.StringField(required=True, max_length=80)
    type = engine.StringField(required=True, max_length=80)
    subtype = engine.StringField(required=True, max_length=80)
    doors = engine.IntField(required=True)
    transmission = engine.StringField(required=True, max_length=80)
    photos = engine.ListField(engine.StringField(max_length=150))
    equipment = engine.ListField(engine.StringField(max_length=80))
    powered_by = engine.StringField(required=True, max_length=80)
    availability = engine.ListField(engine.DateField())
    pickup_place = engine.PointField()
    creation_date = engine.DateTimeField(required=True)

class Owner(engine.Document):
    _id = engine.ObjectIdField()
    name = engine.StringField(required=True, max_length=100)
    surname = engine.StringField(required=True, max_length=100)
    gender = engine.StringField(required=True, max_length=1)
    birthday = engine.DateField(required=True)
    creation_date = engine.DateTimeField(required=True)
    last_update = engine.DateTimeField()
    photo = engine.StringField(required=True, max_length=200)
    access = engine.EmbeddedDocumentField(Access)
    address = engine.EmbeddedDocumentField(Address)
    vehicle = engine.EmbeddedDocumentListField(Vehicle)

标签: mongodbmongoenginefastapi

解决方案


我在 MongoShell 上得到了我想要的结果

db.owner.aggregate([{ $unwind:"$vehicle"}, {$match:{ "vehicle.model":"Jetta", "vehicle.brand":"VW"}}, {$project: {"vehicle.model":1, "vehicle.brand":1, "vehicle.color":1, "vehicle.doors":1, "vehicle.transmission":1, "vehicle.powered_by":1 ,"vehicle.photos":1, "vehicle.equipment":1, "vehicle.availability":1, "vehicle.pickup_place":1}} ]);```  


i attempted to do the same on MongoEngine, but the result is different:

```python
def get_vehicles():
    pipeline = [
        
            { "$unwind":"$vehicle"},
            {
                "$match":{ "vehicle.model":"Jetta", "vehicle.brand":"VW"}
            },
            {
                "$project": {"vehicle.model":1, "vehicle.brand":1, "vehicle.color":1, "vehicle.doors":1, "vehicle.transmission":1, "vehicle.powered_by":1 ,"vehicle.photos":1, "vehicle.equipment":1, "vehicle.availability":1, "vehicle.pickup_place":1}
            }
        ]
    vehicles = Owner.objects.aggregate(pipeline)
    return {"vehicles":vehicles}```

推荐阅读