如何在awsappsync中对简单的graphQL查询进行排序

时间:2019-09-06 15:01:32

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

我所需要的非常简单,在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
  }
}

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

我什至试图创建一个二级索引,但是它没有任何改变...

有人知道实现此目标的最佳方法吗?

1 个答案:

答案 0 :(得分:1)

更改您的listPlants解析器以执行查询而不是执行扫描,您可以利用scanIndexForward布尔值基于提供的索引来确定要返回的结果是升序还是降序(在您的情况下为“名称”)

这将要求您为DynamoDB中的name属性建立索引。

有关更多信息,请参阅以下文档中的“查询”部分:

尤其是:

  

ScanIndexForward

     

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

     

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

     

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

Here's a detailed stackoverflow answer that details this.