Maison  >  Article  >  développement back-end  >  La désorganisation des projets dynamodb renvoie le même projet

La désorganisation des projets dynamodb renvoie le même projet

PHPz
PHPzavant
2024-02-08 23:00:11998parcourir

解组 dynamodb 项目返回相同的项目

L'éditeur PHP Zimo vous présentera aujourd'hui comment résoudre le problème du dissociation des éléments DynamoDB et du renvoi des mêmes éléments. DynamoDB est une base de données clé-valeur sans serveur hautes performances, mais elle peut parfois renvoyer les mêmes éléments lors de leur interrogation, ce qui peut constituer un problème délicat pour les développeurs. Ne vous inquiétez pas, nous vous fournirons une solution pour garantir que les résultats de votre requête sont uniques et corrects. Dans cet article, nous expliquerons en détail la cause du problème et proposerons un moyen simple et efficace de le résoudre. Nous allons jeter un coup d'oeil!

Contenu de la question

J'ai une boucle de plage en golang qui boucle sur une carte de type.attributevalues renvoyée par dynamodb à l'aide d'une fonction d'analyse.

J'ai utilisé la fonction intégrée fournie par le package golang aws-sdk-v2 attributevalue.unmarshalmap() pour parcourir cette carte, et ce qui s'est passé, c'est que j'ai récupéré des éléments de la même longueur que la tranche.

Code :

type users struct {
    user *string `dynamodbav:"user"` 
    email *string `dynamodbav:"email"` 
    }

    user := users{}
  
   for _ , dbitem := range dynamoresults.items { 
    err = attributevalue.unmarshalmap(dbitem, &user)
   }

// gives the same pointer location for all 
users[0].user 
users[1].user
users[2].user

J'ai également essayé d'ajouter l'utilisateur à la tranche dans les résultats

// this just gives a slice with the same items as above
 u := []Users{}
for _ , dbItem := range dynamoResults.Items { 
        err = attributevalue.UnmarshalMap(dbItem, &Users)
        u = append(u, Users)
       }

La solution que j'ai trouvée en utilisant attributevalue.unmarshallistofmaps() est simplement de fournir à la fonction une tranche d'éléments de dynamodb.

Ma question est en fait de comprendre pourquoi l'utilisation des deux solutions ci-dessus ne fonctionne pas comme prévu, ne parcourt-elle pas les éléments dynamodb et ne les transmet-il pas individuellement à la fonction unmarshal ? On dirait que je continue à faire la même chose.

Solution de contournement

Si nous modifions un peu le problème - du démarshalling dynamo db au démarshaling json - alors nous pouvons le faire dans le go terrain de jeu. Dans l'exemple de code, je vois deux facteurs travaillant ensemble pour provoquer des valeurs de tranche en double :

  1. La cible de désorganisation est définie en dehors de la boucle (ligne 51), donc lorsque u1out est désorganisée, le résultat est écrit au même emplacement à chaque itération de boucle (ligne 54).

  2. La chaîne pointée par
  3. user1 类型的字段为 *string,因此当将循环变量值复制到切片时(第 55 行),useremail ne sera pas copiée. Seules leurs valeurs de pointeur sont copiées.

En mettant ces deux ensemble, chaque itération écrira les valeurs user et email non marshallées dans le même emplacement mémoire. Ceci est démontré par les deux premières lignes de sortie, qui impriment des éléments de

. useremail 值写入同一内​​存位置。输出的前两行证明了这一点,它们打印 u1out

Les lignes de sortie restantes affichent les résultats dans trois autres cas : lorsque la variable cible est déplacée à l'intérieur de la boucle (

). Dans chaque cas, de nouveaux emplacements de valeurs non regroupées sont créés comme prévu et les doublons ne sont pas imprimés. u1inu2in)或字段更改为 stringu2out

package main

import (
    "encoding/json"
    "fmt"
)

type (
    Users1 struct {
        User  *string
        Email *string
    }
    Users2 struct {
        User  string
        Email string
    }
)

func main() {
    dbItems := []string{
        `{"User":"userA","Email":"<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="a7d2d4c2d5e6e7c2dfc6cad7cbc289c4c8ca">[email&#160;protected]</a>"}`,
        `{"User":"userB","Email":"<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="5a2f293f28181a3f223b372a363f74393537">[email&#160;protected]</a>"}`,
    }

    u1Out := withVarDeclaredOutsideLoop[Users1](dbItems)
    printUsers(u1Out)

    u1In := withVarDeclaredInsideLoop[Users1](dbItems)
    printUsers(u1In)

    u2Out := withVarDeclaredOutsideLoop[Users2](dbItems)
    printUsers(u2Out)

    u2In := withVarDeclaredInsideLoop[Users2](dbItems)
    printUsers(u2In)

    // Output
    // u[0] = {User:0xc000014130 Email:0xc000014140}
    // u[1] = {User:0xc000014130 Email:0xc000014140}
    // u[0] = {User:0xc0000141c0 Email:0xc0000141d0}
    // u[1] = {User:0xc000014210 Email:0xc000014220}
    // u[0] = {User:userA Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="86f3f5e3f4c7c6e3fee7ebf6eae3a8e5e9eb">[email&#160;protected]</a>}
    // u[1] = {User:userB Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="07727462754547627f666a776b622964686a">[email&#160;protected]</a>}
    // u[0] = {User:userA Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="98edebfdead9d8fde0f9f5e8f4fdb6fbf7f5">[email&#160;protected]</a>}
    // u[1] = {User:userB Email:<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="fe8b8d9b8cbcbe9b869f938e929bd09d9193">[email&#160;protected]</a>}
}

func withVarDeclaredOutsideLoop[T any](dbItems []string) []T {
    var t T
    u := []T{}
    for _, dbItem := range dbItems {
        json.Unmarshal([]byte(dbItem), &t)
        u = append(u, t)
    }
    return u
}

func withVarDeclaredInsideLoop[T any](dbItems []string) []T {
    u := []T{}
    for _, dbItem := range dbItems {
        var t T
        json.Unmarshal([]byte(dbItem), &t)
        u = append(u, t)
    }
    return u
}

func printUsers[T any](u []T) {
    for i, user := range u {
        fmt.Printf("u[%d] = %+v\n", i, user)
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer