按对象数组 [Sanity.io & GROQ] 中的字段值过滤查询结果

Filter query result by field value inside array of objects [Sanity.io & GROQ]

我试图在我的产品列表中找到一个产品变体(在 sanity.io 使用 GROQ),为此,我有我想要的变体的 sku。

我使用的查询是 *[_type == "product" && variants[].sku.current =="kit-kat-wasabi-5" ] 但是这个查询 returns 一个空数组。我确定 sku 是正确的,因为如果我将过滤器放在一边,并获取所有我能找到的东西。 我尝试用匹配替换“==”,但结果是一样的。

我的架构是

产品

export default {
  name: 'product',
  title: 'Product',
  type: 'document',
  fields: [
    {
      name: 'title',
      title: 'Inner Title',
      type: 'string'
    },
    {
      title: 'SKU',
      name: 'sku',
      type: 'slug',
      options: {
        source: 'title',
        maxLength: 96
      },
      validation: Rule => Rule.required()
    },
    {
      name: 'titleWebsite',
      title: 'Title Website',
      type: 'localeString'
    },
    {
      name: 'active',
      title: 'Active',
      type: 'boolean'
    },
    {
      name: 'mainImage',
      title: 'Imagem',
      type:"image"
    },
    {
      name: 'slug',
      title: 'Slug',
      type: 'slug',
      options: {
        source: 'title',
        maxLength: 96
      }
    },
    {
      title: 'Base Price',
      name: 'basePrice',
      type: 'localeCurrency'
    },
    {
      title: 'Quantidade',
      name: 'qty',
      type: 'number'
    },
   /* {
      title: 'Default variant',
      name: 'defaultProductVariant',
      type: 'productVariant'
    },*/
    {
      title: 'Variants',
      name: 'variants',
      type: 'array',
      of: [
        {
          title: 'Variant',
          type: 'productVariant'
        }
      ]
    },
    {
      title: 'Tags',
      name: 'tags',
      type: 'array',
      of: [
        {
          type: 'string'
        }
      ],
      options: {
        layout: 'tags'
      }
    },
    {
      name: 'vendor',
      title: 'Vendor',
      type: 'reference',
      to: {type: 'vendor'}
    },
    {
      name: 'blurb',
      title: 'Blurb',
      type: 'localeString'
    },

    {
      name: 'categories',
      title: 'Categories',
      type: 'array',
      of: [
        {
          type: 'reference',
          to: {type: 'category'}
        }
      ]
    },
    {
      name: 'body',
      title: 'Body',
      type: 'localeBlockContent'
    }
  ],

  preview: {
    select: {
      title: 'title',
      manufactor: 'manufactor.title',
      media: 'mainImage'
    }
  }
}

和 productVariant

export default {
  title: 'Product variant',
  name: 'productVariant',
  type: 'object',
  fields: [
    {
      title: 'Title',
      name: 'title',
      type: 'string'
    },
    {
      title: 'Title Website',
      name: 'titleWebsite',
      type: 'localeString'
    },
    {
      title: 'Weight in grams',
      name: 'grams',
      type: 'number'
    },
    {
      title: 'Price',
      name: 'price',
      type: 'localeCurrency'
    },
    {
      title: 'SKU',
      name: 'sku',
      type: 'slug',
      options: {
        source: 'title',
        maxLength: 96
      },
      validation: Rule => Rule.required()
    },
    {
      title: 'Taxable',
      name: 'taxable',
      type: 'boolean'
    },
    {
      name: 'blurb',
      title: 'Blurb',
      type: 'localeString'
    },
    {
      name: 'images',
      title: 'Images',
      type: 'array',
      of: [
        {
          type: 'image',
          options: {
            hotspot: true
          }
        }
      ]
    },
    {
      title: 'Quantidade',
      name: 'qty',
      type: 'number'
    },
    {
      title: 'Bar code',
      name: 'barcode',
      type: 'barcode'
    }
  ]
}

这是 GROQ 中遍历数组时的一个已知错误。如果要在 GROQ v1 中修复,这将引入重大更改。因此它将在 GROQ v2 中得到修复。

这是解释该问题的错误报告:https://github.com/sanity-io/sanity/issues/1557。你可以在这里表达你对这个问题的兴趣。

这里有第二版的工作草案:https://github.com/sanity-io/groq

关于您的架构,我会考虑将 sku 字段的类型更改为其他类型,例如 string,并为 slug 创建一个新字段,其中包含 source 属性 设置为该字段自动生成的SKU。可在此处找到相关文档:https://www.sanity.io/docs/slug-type.