You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Appwrite Web SDK GraphQL多条件查询报错及实现方案

问题原因

你犯了两个关键错误:

  1. 把两个查询条件塞进了同一个字符串中,GraphQL解析时会将equal("field_1", "a"), equal("field_2", "b")识别为非单一字符串值,触发类型不匹配报错。
  2. 手动嵌套双引号的转义写法冗余且容易出错,进一步加重了解析混乱。

正确实现方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:40:01