Pourquoi DynamoDB analyse avec fin et FilterExpression pas retourner les articles qui correspondent aux exigences du filtre?
J'ai besoin de faire une analyse avec fin et une condition sur DynamoDB.
La docs dit:
Dans une réponse, DynamoDB retourne tous les résultats dans le champ d'application de la valeur Limite. Par exemple, si vous exécutez une Requête ou d'une requête d'Analyse avec une valeur Limite de 6 et sans une expression de filtre, DynamoDB renvoie les six premiers éléments dans la table qui correspond à la clé spécifiée conditions de la demande (ou seulement les six premiers éléments dans le cas d'une Analyse avec pas de filtre). Si vous aussi vous fournir un FilterExpression valeur, DynamoDB va retourner les articles dans les six premiers que de correspondre aux exigences du filtre (le nombre de résultats retourné devra être inférieur ou égal à 6).
Le code (NODEJS):
var params = {
ExpressionAttributeNames: {"#user": "User"},
ExpressionAttributeValues: {":user": parseInt(user.id)},
FilterExpression: "#user = :user and attribute_not_exists(Removed)",
Limit: 2,
TableName: "XXXX"
};
DynamoDB.scan(params, function(err, data) {
if (err) {
dataToSend.message = "Unable to query. Error: " + err.message;
} else if (data.Items.length == 0) {
dataToSend.message = "No results were found.";
} else {
dataToSend.data = data.Items;
console.log(dataToSend);
}
});
Tableau XXXX définitions:
- Partition primaire clés: Utilisateur (Nombre)
- Primaire de la clé de tri: Identificateur (String)
- INDEX:
- Nom De L'Index: RemovedIndex
- Type: GSI
- Clé de Partition: Retiré (Nombre)
- De la clé de tri: -
- Attributs: TOUS les
Dans le code ci-dessus, si je retire la Limit
paramètre, DynamoDB sera de retour les éléments qui correspondent aux critères de filtre. Ainsi, les conditions sont ok. Mais quand je scan avec Limit
paramètre, le résultat est vide.
Le XXXX table, a 5 éléments. Seuls les 2 premiers ont le Removed
attribut. Quand je scanne sans Limit
paramètre, DynamoDB retourne les 3 éléments sans Removed
attribut.
Ce que je fais mal?
Vous devez vous connecter pour publier un commentaire.
De la documentation que vous avez cité:
En combinant Limite et FilterExpression vous avez dit DynamoDB pour qu'à regarder les deux premiers éléments dans le tableau, et d'évaluer la FilterExpression contre ces éléments. Limite de DynamoDB peut être source de confusion car il fonctionne différemment de
limit
dans une expression SQL dans un SGBDR.limit
comme une expression SQL dans les SGBDR?limit
fonctionne de la même manière dans DynamoDB comme il le fait dans un SGBDR, sans prendre le temps de lire la documentation.Également rencontré ce problème, je suppose que vous aurez juste besoin de parcourir l'ensemble du tableau à un maximum de 1 MO
Scan
Les résultats à partir d'une Analyse est limitée à 1 MO par appel. Vous pouvez utiliser le
LastEvaluatedKey
à partir de l'analyse de la réponse à récupérer plus de résultats.http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html
Vous pourriez être en mesure d'obtenir ce dont vous avez besoin à l'aide d'un index secondaire. À l'aide de la classique RDB exemple, la commande client par exemple: vous avez une table pour les clients et un pour les commandes. Les Commandes de la table a une Clé composée de Client de HACHAGE, de l'Ordre de la PLAGE. Donc si vous voulez obtenir les 10 derniers ordres, il n'y aurait aucun moyen de le faire sans une analyse
Mais si vous créez un Index Secondaire Global sur les commandes de "Certains Constante" -- HASH, PLAGE de dates, et interrogé à l'encontre de cet indice, ils requête serait de faire ce que vous voulez et ne vous facturer pour le RCUs impliqués avec les enregistrements renvoyés. Pas cher et d'analyse nécessaires. Remarque, écrit sera plus cher, mais dans la plupart des cas, il y a beaucoup plus de lectures que de l'écrit.
Maintenant vous avez votre problème d'origine si vous voulez obtenir les 10 plus gros des commandes pour un jour de plus de $1000. La requête retourne les 10 dernières commandes, puis filtrer ceux de moins de $1000.
Dans ce cas, vous pourriez créer une clé calculée de Date-OrderAmount, et les requêtes à l'encontre de cet indice serait de retour que vous souhaitez.
Il n'est pas aussi simple que SQL, mais vous devez penser à des modèles d'accès à SQL trop. Si vous avez beaucoup de données, vous devez créer des Index dans SQL ou de la DB sera heureusement pour les analyses de table sur votre nom, ce qui va entraver la performance et augmenter vos coûts.
Remarque que tout ce que j'ai proposé est normalisé dans le sens qu'il n'existe qu'une seule source de vérité. Vous n'êtes pas dupliquer des données -- vous êtes simplement à la refonte des vues sur elle pour obtenir ce que vous avez besoin de DynamoDB.
Garder à l'esprit que la CONSTANTE d'un algorithme de HACHAGE s sous réserve de l'10 go par partition de limite, de sorte que vous devez à la conception autour d'elle si vous avez eu beaucoup de données active. Par exemple, en fonction de votre modèle d'accès, vous pouvez utiliser le Client et pas une constante d'un algorithme de HACHAGE. Ou utiliser les Flux d'organiser les données (ou sous-ensembles) par d'autres moyens.
Petit hack - Itérer jusqu'à ce que vous obtenez les résultats
Si le nombre d'éléments récupérés est 0 et lastEvaluatedKey n'est pas null, ce qui signifie qu'il a scanné ou interrogé le nombre de lignes qui correspondent à votre limite. (et la taille de résultat est zéro, parce qu'ils ne correspondent pas l'expression de filtre)