Sanity.io GROQ 查询对象数组

我正在学习编码,现在我正处于一个以 Sanity 作为 CMS 的小型宠物项目的阶段。长话短说,制作一个 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
]

我怎样才能达到预期的效果?感谢您的阅读!将不胜感激任何帮助!

stack overflow Sanity.io GROQ query for array of objects
原文答案

答案:

作者头像

是的,在“扁平化”我自己的预测方面也有类似的挣扎。我用 dot-syntax 解决了它。尝试在第一次尝试时添加 .votes

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

如果这是正确的,则可以简化整个查询,但我还没有达到这个水平,但是我可以在不针对类似集合进行测试的情况下做到这一点,'-)

作者头像

实际上,从 v2021-03-25 开始,GROQ 具有展平数组的语法

找到这个例子:

{
  'nestedArray': [
    {'foo': [1,2,3,4,5]},
    {'foo': [6,7,8,9,10,11,12]},
    {'foo': [13,14,15]},
  ]
}{
  'stillNestedArray': @.nestedArray[].foo,
  'flatArray': @.nestedArray[].foo[]
}

注意 [] 之后的 foo - 这就是扁平化它的原因

所以问题的原始查询应该看起来像

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