Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何检索';id';从';项目';在条目/行中?_Database_Amazon Web Services_React Native_Amazon Dynamodb_Aws Appsync - Fatal编程技术网

Database 如何检索';id';从';项目';在条目/行中?

Database 如何检索';id';从';项目';在条目/行中?,database,amazon-web-services,react-native,amazon-dynamodb,aws-appsync,Database,Amazon Web Services,React Native,Amazon Dynamodb,Aws Appsync,使用AWS Amplify使用React Native(适用于iOS)构建应用程序 我想做一些看起来很简单的事情,但是我有点不知所措:我有一个已经包含用户信息的表。以下是模式: type Users @model { id: ID! userName: String firstname: String weblink: String email: String mobileNum: String . . . } //**Here's my current Que

使用AWS Amplify使用React Native(适用于iOS)构建应用程序

我想做一些看起来很简单的事情,但是我有点不知所措:我有一个已经包含用户信息的表。以下是模式:

type Users @model {
  id: ID!
  userName: String
  firstname: String
  weblink: String
  email: String
  mobileNum: String
 .
 .
 .
}


//**Here's my current Query.js**
export const getUsers = `query GetUsers($id: ID!) {
  getUsers(id: $id) {
    id
    userName
    firstname
    weblink
    email
    .
    .
    .
  }
}
`;
当我检查AWS控制台时,此表在DynamoDB中填充。我需要的是能够使用用户名从表中获取id(反之亦然)。id是在我创建user()时生成的,它在我的整个应用程序中用于获取我用户的所有信息。但是,当用户在新手机上登录时,此id将不再可用。因此,当他们通过Cognito登录时,我知道用户名,我需要做的就是检索这个id。因为只有一个唯一的用户名,所以它应该只返回一个id

到目前为止,我的想法是:使用GSI(全局二级索引)。因此,将我的模式更改为:

type Users @model
    @key(
       name: "ByUsername"
       fields: ["userName"]
       queryField: "getIdFromUserName"
    )  
{
  id: ID!
  userName: String
  firstname: String
  weblink: String
  email: String
  mobileNum: String
 .
 .
 .
}
然后调用我的应用程序:

const data = await API.graphql(graphqlOperation(getIdFromUserName, { userName }));
5个问题:

1) 有没有比GSI更简单的方法

2) 这就是你添加GSI的方式吗?还是在AWS控制台中执行更健壮

3) 那么我的Query.js应该是什么样子

4) 我是否需要制作自定义解析器,或者这就足够了

5) 我还缺什么吗,或者我可以

amplify push  ?

//11/04/2020
//Resolver

## [Start] Prepare DynamoDB PutItem Request. **
$util.qr($context.args.input.put("createdAt", $util.defaultIfNull($ctx.args.input.createdAt, $util.time.nowISO8601())))
$util.qr($context.args.input.put("updatedAt", $util.defaultIfNull($ctx.args.input.updatedAt, $util.time.nowISO8601())))
$util.qr($context.args.input.put("__typename", "Users"))
#set( $condition = {
  "expression": "attribute_not_exists(#id)",
  "expressionNames": {
      "#id": "id"
  }
} )
#if( $context.args.condition )
  #set( $condition.expressionValues = {} )
  #set( $conditionFilterExpressions = $util.parseJson($util.transform.toDynamoDBConditionExpression($context.args.condition)) )
  $util.qr($condition.put("expression", "($condition.expression) AND $conditionFilterExpressions.expression"))
  $util.qr($condition.expressionNames.putAll($conditionFilterExpressions.expressionNames))
  $util.qr($condition.expressionValues.putAll($conditionFilterExpressions.expressionValues))
#end
#if( $condition.expressionValues && $condition.expressionValues.size() == 0 )
  #set( $condition = {
  "expression": $condition.expression,
  "expressionNames": $condition.expressionNames
} )
#end
{
  "version": "2017-02-28",
  "operation": "PutItem",
  "key": #if( $modelObjectKey ) $util.toJson($modelObjectKey) #else {
  "id":   $util.dynamodb.toDynamoDBJson($util.defaultIfNullOrBlank($ctx.args.input.id, $util.autoId()))
} #end,
  "attributeValues": $util.dynamodb.toMapValuesJson($context.args.input),
  "condition": $util.toJson($condition)
}
## [End] Prepare DynamoDB PutItem Request. **
1) 您不需要创建GSI(全局二级索引)

2) 您可以更新createUser解析器,而不是使用
$util.autoId()
您可以将
$ctx.args.input.userName
作为id传递1)您不需要创建GSI(全局辅助索引)


2) 您可以更新createUser解析器,而不是使用
$util.autoId()
您可以将
$ctx.args.input.userName
作为id传递给Hi Muhammad。我的大多数操作仍然使用“$ctx.args.input.id”。然而,我只需要使用“用户名”一两次。我只是不想用“id”来破坏已经存在的东西(也许这就是我想到GSI的原因)。我能否与您分享我的解析器,以了解如何实现这一点?谢谢,我已经添加了我的createUser解析器(放大自动生成的)。因此,我95%的时间使用id从DynamoDB中的Users表获取数据。还有5%,我需要使用用户名来获取相应的“id”。在解析器文件夹中创建自定义解析器不是更安全吗?嗨,穆罕默德。我的大多数操作仍然使用“$ctx.args.input.id”。然而,我只需要使用“用户名”一两次。我只是不想用“id”来破坏已经存在的东西(也许这就是我想到GSI的原因)。我能否与您分享我的解析器,以了解如何实现这一点?谢谢,我已经添加了我的createUser解析器(放大自动生成的)。因此,我95%的时间使用id从DynamoDB中的Users表获取数据。还有5%,我需要使用用户名来获取相应的“id”。在解析器文件夹中创建自定义解析器不是更安全吗?