2

私はコーディングを学んでおり、現在、CMS として Sanity を使用した小さなペット プロジェクトの段階にいます。簡単に言うと、API を作成して、カクテルへの投票でカクテル データを取得しようとしています。投票は、投票した人に保存されます。

GROQ クエリ

*[
  _type == "cocktail" &&
    !(_id in path('drafts.**'))
 ] {
  name,
  _id,
    "votes" : *[_type == "person" && references(^._id)] {
    votes[] {
        score,
        "id": cocktail._ref
        }
    } 
}

返す

[
  {
    "_id": "pdUGiuRzgLGpnc4cfx76nA",
    "name": "Cuba Libre",
    "votes": [
      {
        "votes": {
          "id": "pdUGiuRzgLGpnc4cfx76nA",
          "score": 2
        }
      },
      {
        "votes": {
          "id": "pdUGiuRzgLGpnc4cfx76nA",
          "score": 2
        }
      }
    ]
  },
  {
    "_id": "pdUGiuRzgLGpnc4cfxBOyM",
    "name": "The ERSH7",
    "votes": []
  }
]

ご覧のとおり、マージは投票の埋め込み配列を提供しますが、次のようなものが必要です。

[{
  ...cocktail attributes...
  "votes" : [
    {score: 2, id: pdUGiuRzgLGpnc4cfx76nA},
    {score: 2, id: pdUGiuRzgLGpnc4cfx76nA}
  ]
 }
... more cocktails....
]

これを取得しようとして、クエリを変更しました:

*[
  _type == "cocktail" &&
    !(_id in path('drafts.**'))
 ] {
  name,
  _id,
    "votes" : *[_type == "person" && references(^._id)].votes[] {
        score,
        "id": cocktail._ref
    }
}

これは、arr の投票のすべての要素から射影する必要があります。残念ながら、空の配列を取得します:

[
{
  "_id": "pdUGiuRzgLGpnc4cfx76nA",
  "name": "Cuba Libre",
  "votes": [
    {},
    {}
  ]
}
...more cocktails
]

どうすれば望ましい結果を得ることができますか? 読んでくれてありがとう!助けていただければ幸いです!

4

2 に答える 2

1

はい、自分自身の投影を「平坦化」することで同様の苦労がありました。dot-syntaxで解決しました。.votes最初の試行で追加してみてください:

*[
  _type == "cocktail" &&
  !(_id in path('drafts.**'))
]
{
  name,
  _id,
  "votes" : *[_type == "person" && references(^._id)] {
    votes[] {
      score,
      "id": cocktail._ref
    }
  }
  .votes
}

これが正しい場合、クエリ全体を単純化できますが、同様のセットに対してテストせずにそれを実行できるレベルにはまだ達していません ,'-)

于 2021-02-11T13:11:10.723 に答える