如何在Contentful中按对象数组字段进行查询?
解决Contentful Delivery API筛选包含特定国家条目问题
我明白你现在遇到的困扰了——直接用fields.countries=xxx查询会报错,核心原因是countries是一个包含链接对象的数组,equals操作符没法直接作用在对象类型的字段上。
正确的查询方式
Contentful的Delivery API针对数组类型的引用字段,需要通过嵌套字段路径加上合适的操作符来筛选。你需要指定检查countries数组里每个对象的sys.id是否匹配目标ID,用[in]操作符来实现“包含”的逻辑。
具体的请求URL应该是这样的:
https://cdn.contentful.com/spaces/aoeuaoeuao/entries?content_type=contentPage&fields.countries.sys.id[in]=3S5dbLRGjS2k8QSWqsKK86
这里的[in]操作符会检查countries数组中是否存在任意一个对象的sys.id等于你指定的ID,正好满足你“仅返回包含特定国家的条目”的需求。
.NET API中的实现
如果你后续用Contentful的.NET SDK(比如Contentful.Core),可以这样构建查询:
using Contentful.Core; using Contentful.Core.Models; using Contentful.Core.QueryHelpers; // 初始化客户端 var client = new ContentfulClient( "<你的Delivery API密钥>", "<你的Space ID>" ); // 构建查询 var query = new QueryBuilder<ContentPage>() .Field("fields.countries.sys.id[in]", "3S5dbLRGjS2k8QSWqsKK86") .ContentType("contentPage"); // 获取结果 var response = await client.GetEntriesAsync<ContentPage>(query);
或者用更类型安全的方式(假设你已经生成了对应Content类型的模型类):
var query = new QueryBuilder<ContentPage>() .Where(x => x.Countries, QueryOperator.In, "3S5dbLRGjS2k8QSWqsKK86", "sys.id") .ContentType("contentPage");
额外说明
你之前在CMS里看到的filters.0.key这类参数是Contentful后台内部使用的查询格式,Delivery API并不支持,所以不用尝试用它来调用公开API。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

