我有这个查询:
query ListFreightDriverTrucks($state: String! $tons: Float!) {
listFreightDrivers(filter: {
state: {
contains: $state
}
}) {
items {
name
city
state
trucks (filter: {
tons: {
eq: $tons
}
}) {
items {
id
brand
model
fuelType
fuelEfficiency
utilityPercentage
tons
axes
frontPhoto
truckBox {
type
width
height
depth
}
}
}
}
}
}
作为回应,我得到了与哈利斯科的$state
相匹配的数据。
{
"data": {
"listFreightDrivers": {
"items": [
{
"name": "Jaen Carlos",
"city": "Zapopan",
"state": "Jalisco",
"trucks": {
"items": []
}
},
{
"name": "Diey",
"city": "Zapopan",
"state": "Jalisco",
"trucks": {
"items": []
}
},
{
"name": "Roberto mendez",
"city": "Guadalajara",
"state": "Jalisco",
"trucks": {
"items": []
}
},
{
"name": "Engineering",
"city": "Zapopan",
"state": "Jalisco",
"trucks": {
"items": []
}
},
{
"name": "Roberto mendez",
"city": "Guadalajara",
"state": "Jalisco",
"trucks": {
"items": []
}
},
{
"name": "Andrés",
"city": "Zapopan",
"state": "Jalisco",
"trucks": {
"items": [
{
"id": "2b0cb78e-49c4-4229-8a71-60b350a5fc47",
"brand": "chevrolet",
"model": "xx",
"fuelType": "magna",
"fuelEfficiency": 12,
"utilityPercentage": 10,
"tons": 15,
"axes": 12,
"frontPhoto": "freight-driver/e9adf7fb-09c2-477e-9152-56fe4a71a96b/trucks/dlb0275xqna51.png",
"truckBox": {
"type": "Plataforma",
"width": 4,
"height": 4,
"depth": 4
}
}
]
}
}
]
}
}
}
如果你检查响应,有一些这样的:
"trucks": {
"items": []
}
但我对这些不感兴趣,因为它们与$tons
不匹配,就像上一个一样。如何移除它们?
如果我需要生成lambda,DynamoDB查询会是什么样子?
我经常看到这个问题,这让我有点不安全,但GraphQL实际上不应该这样工作。你应该得到你所要求的,而不是";SQL查询自己的胜利";。
Anyhoot,
您可以在解析器(req.vtl文件(中通过过滤掉所有trucks.items.length<1或其他事物。请查看此链接应用程序同步&GraphQL:如何通过嵌套值过滤列表
请注意,这是一个DynamoDB扫描操作(所有列表操作都是(,速度相当慢。
AWS DynamoDB的设计理念与您大多数时候都知道您正在寻找的唯一密钥相同,并且只过滤少量项目。添加大量索引或组合键。
如果您想更新数据模型,建议阅读以下内容:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices.html
也许可以重新思考您的GraphQL设计?我对卡车一无所知,但可能是
- "Location has Truck has Driver";相反或
- "地点有司机有卡车吗
甚至两者都有!由于GraphQL为您提供了所需内容,因此Driver可以包含Truck和Truck。
Location {
id: ID!
truck: [Truck]
driver: [Driver]
}
Truck {
id: ID!
driver: Driver!
}
Driver {
id: ID!
Truck: Truck!
}
Amplify自动生成深度为2的内容,这样你的列表就不会永远循环,你就不会要求你不需要的东西。这里有很多选择。
https://docs.amplify.aws/cli/graphql-transformer/dataaccess
如果你想让它成为Lambda(@函数(,dynamo语法非常简单(而且几乎相同(。
要么你扫描整张桌子https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#scan-财产或者创建一个索引进行查询,然后进行筛选https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#query-属性
最后但并非最不重要的