簡體   English   中英

使用 knex 刪除多個連接數組中的重復項的 Postgres 查詢

[英]Postgres query to remove duplicates in multiple joined arrays using knex

我正在使用 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM