Appwrite Web SDK GraphQL多条件查询报错及实现方案
问题原因
你犯了两个关键错误:
- 把两个查询条件塞进了同一个字符串中,GraphQL解析时会将
equal("field_1", "a"), equal("field_2", "b")识别为非单一字符串值,触发类型不匹配报错。 - 手动嵌套双引号的转义写法冗余且容易出错,进一步加重了解析混乱。
正确实现方案
1. AND 查询(field_1 = "a" AND field_2 = "b")
Appwrite多查询条件默认是AND逻辑,直接在queries数组中传入两个独立的equal查询字符串即可:
const { Client, Graphql } = Appwrite; const client = new Client() .setEndpoint("http://localhost:8080/v1/graphql") .setProject(project_id); const graphql = new Graphql(client); const andQuery = graphql.query({ query: ` query { databasesListDocuments( databaseId: "${db_id}", collectionId: "${collectionId}", queries: ["equal('field_1', 'a')", "equal('field_2', 'b')"] ) { total documents { _id data } } } ` }); // 执行查询 andQuery.then(res => console.log("AND查询结果:", res)) .catch(err => console.error("AND查询错误:", err));
这里用单引号包裹字段和值,避免模板字符串的双引号转义问题,写法更简洁。
2. OR 查询(field_1 = "a" OR field_2 = "b")
OR逻辑需要用Appwrite的or查询语法,将两个equal条件作为参数传入or函数,作为单个字符串放入queries数组:
const orQuery = graphql.query({ query: ` query { databasesListDocuments( databaseId: "${db_id}", collectionId: "${collectionId}", queries: ["or(equal('field_1', 'a'), equal('field_2', 'b'))"] ) { total documents { _id data } } } ` }); // 执行查询 orQuery.then(res => console.log("OR查询结果:", res)) .catch(err => console.error("OR查询错误:", err));
更稳妥的写法(用Query辅助类)
如果不想手动拼接查询字符串,可以用Appwrite的Query类生成查询语句,再通过JSON.stringify转成GraphQL可识别的格式:
const { Client, Graphql, Query } = Appwrite; // 初始化client和graphql实例同前 // 生成AND查询数组 const andQueries = [Query.equal('field_1', 'a'), Query.equal('field_2', 'b')]; // 生成OR查询数组 const orQueries = [Query.or(Query.equal('field_1', 'a'), Query.equal('field_2', 'b'))]; // 执行AND查询 const andQuery = graphql.query({ query: ` query { databasesListDocuments( databaseId: "${db_id}", collectionId: "${collectionId}", queries: ${JSON.stringify(andQueries)} ) { total documents { _id data } } } ` }); // 执行OR查询 const orQuery = graphql.query({ query: ` query { databasesListDocuments( databaseId: "${db_id}", collectionId: "${collectionId}", queries: ${JSON.stringify(orQueries)} ) { total documents { _id data } } } ` });
内容的提问来源于stack exchange,提问作者klopstock
相关产品推荐
相关产品推荐

