web-dev-qa-db-fra.com

DynamoDB crée un index sur un type de carte ou de liste

J'essaie d'ajouter un index à un attribut à l'intérieur d'un objet de carte dans DynamoDB et je n'arrive pas à trouver un moyen de le faire. Est-ce quelque chose qui est pris en charge ou les index ne sont-ils vraiment autorisés que sur des valeurs scalaires? La documentation à ce sujet semble assez clairsemée. J'espère que la fonctionnalité d'indexation est similaire à MongoDB mais jusqu'à présent, les approches que j'ai adoptées pour référencer l'attribut à indexer en utilisant la syntaxe à points n'ont pas réussi. Toute aide ou information supplémentaire pouvant être fournie est appréciée.

34
BryceH

Les index ne peuvent être créés que sur des attributs JSON de niveau supérieur. En outre, les clés de plage doivent être des valeurs scalaires dans DynamoDB (l'une de String, Number, Binary ou Boolean).

De http://aws.Amazon.com/dynamodb/faqs/ :

Q: L'interrogation des données JSON dans DynamoDB est-elle différente?

Non. Vous pouvez créer un index secondaire global ou un index secondaire local sur n'importe quel élément JSON de niveau supérieur. Par exemple, supposons que vous ayez stocké un document JSON contenant les informations suivantes sur une personne: prénom, nom, code postal et une liste de tous ses amis. Le prénom, le nom et le code postal seraient des éléments JSON de niveau supérieur. Vous pouvez créer un index pour vous permettre d'interroger en fonction du prénom, du nom ou du code postal. La liste d'amis n'est pas un élément de niveau supérieur, vous ne pouvez donc pas indexer la liste d'amis. Pour plus d'informations sur l'indexation secondaire globale et ses capacités de requête, consultez la section Index secondaires de cette FAQ.

Q: Quels types de données peuvent être indexés?

Tous les types de données scalaires (Number, String, Binary et Boolean) peuvent être utilisés pour l'élément clé de plage de la clé d'index secondaire locale. Les types d'ensemble, de liste et de carte ne peuvent pas être indexés.

34
Ben Schwartz

J'ai essayé de faire du hachage (str (objet)) pendant que je stocke l'objet séparément. Ce hachage me donne un entier (Number) et je peux utiliser un index secondaire dessus. Ci-dessous un exemple en python , il est important d'utiliser une fonction de hachage qui génère à chaque fois la même clé de hachage pour la valeur. J'utilise donc sha1.

# Generate a small integer hash:
import hashlib
def hash_8_digits(source):
    return int(hashlib.sha1(source.encode()).hexdigest(), 16) % (10 ** 8)

L'idée est de garder l'objet entier petit tout en conservant l'entité intacte. c'est-à-dire que plutôt que de sérialiser et de stocker l'objet sous forme de chaîne et de changer la façon dont l'objet est utilisé, je stocke une valeur de hachage plus petite avec la liste ou la carte réelle.

1
user 923227