【问题标题】:How to sort a simple graphQL query in awsappsync?如何在 awsappsync 中对简单的 graphQL 查询进行排序
【发布时间】:2020-01-09 11:25:54
【问题描述】:

我需要的非常简单,在 SQL 中我会说我只需要一个 SORT ASCENDING 或 DESCENDING。

但我使用 GraphQL、AppSync、DynamoDB 和 React-Native 已经有一段时间了,但我仍然不知道如何按名称对输出列表进行排序...

我使用的是简单的场景,没有 React-Native Apollo,只有 Connect 组件。

我的输出列表:

class PlantScreenNoApollo extends React.Component {

...

    render() {

        return (

    <View style={{flex:1, flexDirection:"column", justifyContent:"flex-start"}}>

        <View style={{flex:1,
                  flexDirection:"row",
                  justifyContent:"center",
        }}>
            <TextInput style={styles.sTextInput}
                        onChangeText={ (text) => this._updateFilter(text) }
                        value={this.state.filter}/>
            <Ionicons name={"ios-search"} size={30} />
        </View>

        <View style={{  flex:1, 
                        flexDirection:"column",
                        justifyContent:"flex-start",
                        alignContent: "center",
                        minHeight: "70%",}}>

        <Connect query={ this.state.filter!=="" ? 
                         graphqlOperation(queries.listPlants, {
                            filter: {
                                name: {
                                    contains: this.state.filter
                                }
                            }
                         })
                         :
                         graphqlOperation(queries.listPlants)

        }>
            {
                ( { data: { listPlants }, loading, error } ) => {

                    if(error) return (<Text>Error</Text>);

                    if(loading || !listPlants) return (<ActivityIndicator />);

                    return (

                          <FlatList
                            data={listPlants.items}
                            renderItem={({item}) => {
                                return (
                                    <View style={{borderBottomWidth:1, borderBottomColor:"green", padding:5}}>
                                    <TouchableOpacity onPress={()=>this._onPress(item)}>
                                        <View style={styles.hcontainer}>
                                            <Image source={{uri:this.state.logoURL}}
                                                style={styles.iconImage}
                                            />
                                            <View style={styles.vcontainer}>
                                                <Text style={styles.textH3}>{item.name}</Text>
                                                <View style={styles.hcontainerflexstart}>
                                                    { item.tea &&  <Image source={{uri:this.state.teaIconURL}} style={styles.iconImageSmall} />}
                                                    { item.bath &&  <Image source={{uri:this.state.bathIconURL}} style={styles.iconImageSmall} />}
                                                    { item.insence &&  <Image source={{uri:this.state.insenceIconURL}} style={styles.iconImageSmall} />}
                                                    { item.children &&  <Image source={{uri:this.state.childrenIconURL}} style={styles.iconImageSmall} />}
                                                </View>
                                            </View>
                                            <Text style={styles.textP}>{item.description.substr(0,50) + "(...)"}</Text>
                                        </View>
                                    </TouchableOpacity>    
                                    </View>
                                );
                            }}
                            keyExtractor={(item, index) => item.id}
                        />

                    );


                }
            }
        </Connect>
        </View>
        <View style={{flex:1, flexDirection:"column", justifyContent:"flex-start"}}>


...

        </View>
    </View>
      );  
    };

}

这是我的查询描述(由模型 + 代码生成自动生成)

export const listPlants = `query ListPlants(
  $filter: ModelPlantFilterInput
  $limit: Int
  $nextToken: String
) {
  listPlants(filter: $filter, limit: $limit, nextToken: $nextToken) {
    items {
      id
      name
      description
      ...
    }
    nextToken
  }
}

我只想按名称对扫描进行排序。

我什至尝试创建二级索引,但它没有改变任何东西......

有谁知道实现这一目标的最佳方法?

【问题讨论】:

    标签: react-native graphql aws-amplify aws-appsync


    【解决方案1】:

    更改您的 listPlants 解析器以执行查询而不是扫描,您可以利用 scanIndexForward 布尔值来确定是否要根据提供的索引以升序或降序返回结果(在您的情况下 - '名称') .

    这将要求您在 DynamoDB 中索引 name 属性(如果它还没有)。

    有关更多信息 - 请查看以下文档中的查询部分:

    特别是:

    扫描索引转发

    指定索引遍历的顺序:如果为true(默认),则按升序进行遍历;如果为false,则按降序进行遍历。

    具有相同分区键值的项目按排序键排序存储。如果排序键数据类型为数字,则结果按数字顺序存储。对于 String 类型,结果按 UTF-8 字节顺序存储。对于 Binary 类型,DynamoDB 将二进制数据的每个字节视为无符号。

    如果 ScanIndexForward 为 true,则 DynamoDB 会按照结果的存储顺序(按排序键值)返回结果。这是默认行为。如果 ScanIndexForward 为 false,则 DynamoDB 按排序键值逆序读取结果,然后将结果返回给客户端。

    Here's a detailed stackoverflow answer that details this.

    【讨论】:

    • 我正在尝试应用此解决方案,但我在解析器中遇到 $modelQueryExpression - 它来自哪里?
    • OK 发现我必须 #set 解析器本身的值,以及如何做到这一点.. 但是我几乎放弃使用关键条件,因为实际上我不需要传递任何内容所需的查询表达式,我只需要正确排序所有项目....考虑创建一个带有@connection的“容器”表,这将生成一个gsi - 但我仍然不知道如何正确填充它......
    猜你喜欢
    • 2020-05-23
    • 2020-09-24
    • 2019-07-16
    • 2018-05-08
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多