mongodb - 我想让 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)
解决方案
我在 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}```
推荐阅读
- palantir-foundry - 为什么我不应该在我的 Python 转换中使用 collect()?
- spring-boot - 在不启动服务器的情况下使用 Spring 应用程序属性
- apache-nifi - 如何在 NiFi 处理器中重新加载外部配置数据
- php - 上传图片或创建新帖子时,Wordpress 中的 net::ERR_CONNECTION_RESET
- cllocationmanager - iOS 14 - 当精确位置权限被拒绝时,如何让 iBeacon 唤醒应用程序?
- php - 指示作曲家在模棱两可时使用不同的类
- python - 您如何重新组织数据框的数据框,以便只有 1 个最终数据框?
- javascript - JS getElementsByName 以部分 id 作为变量
- angular - Firebase:使用另一个检索数据检索数据
- autodesk-forge - 为什么查看器使用 developer-dev.api.autodesk.com 而不是 developer.api.autodesk.com 会导致令牌无效?