我正在使用knex来构建一个postgres查询,并拥有一个配方表,该表与配料表和步骤都具有多对多的关系(每个步骤都是指令的一部分)。我正在尝试将步骤和成分都汇总到查询中自己的数组中。我的问题是,一旦我加入了第二个数组,两个数组就失去了独特性(即表a有2个元素,表b有3个元素;加入表b之后,两个数组现在都有6个元素)。
我试过使用distinct,但是每次尝试都导致抛出错误。
这是我要输出的内容:
"id": 1,
"title": "sometitle",
"ingredients": [
{
"ingredient": "avacado",
"quantity": 24
},
{
"ingredient": "asparagus",
"quantity": 42
},
],
"instructions": [
{
"step": 1,
"instruction": "one"
},
{
"step": 2,
"instruction": "two"
},
{
"step": 3,
"instruction": "three"
},
]
这是我到目前为止的内容:
knex(`recipes as r`)
.where({'r.id': 1})
.join('ingredients_list as list', {'list.recipe_id': 'r.id'})
.join('ingredients', {'list.ingredient_id': 'ingredients.id'})
.join('instructions', {'instructions.recipe_id': 'r.id'})
.select(
'r.id',
db.raw(`json_agg(json_build_object(
'ingredient', ingredients.name,
'quantity', list.quantity
)) as ingredients`),
db.raw(`json_agg(json_build_object(
'step', instructions.step_number,
'instruction', instructions.description
)) as instructions`)
)
.groupBy('r.id')
.first()
这是我想出的解决方案,以防其他人遇到此问题。我认为这是可行的,因为postgres无法评估json对象的相等性。而jsonb是一个二进制对象。我希望对此有一个更彻底的解释是有人拥有。
distinct json_agg(jsonb_build_object(...))
knex(`recipes as r`)
.where({'r.id': 1})
.join('ingredients_list as list', {'list.recipe_id': 'r.id'})
.join('ingredients', {'list.ingredient_id': 'ingredients.id'})
.join('instructions', {'instructions.recipe_id': 'r.id'})
.select(
'r.id',
db.raw(`distinct json_agg(jsonb_build_object(
'ingredient', ingredients.name,
'quantity', list.quantity
)) as ingredients`),
db.raw(`distinct json_agg(jsonb_build_object(
'step', instructions.step_number,
'instruction', instructions.description
)) as instructions`)
)
.groupBy('r.id')
.first()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句