2015-06-02 23 views
8

Neu bei DynamoDB und müssen die obige Abfrage durchführen, aber nicht sicher, wie. Hier ist, was ich gerade versuche, und ich bekomme den Fehler unten.DynamoDB Javascript - Abfrage nach Primärschlüssel und Array von Bereichsschlüsseln?

Btw, ich bin mit dieser JavaScript-Bibliothek w/DynamoDB: https://github.com/awslabs/dynamodb-document-js-sdk

var ids = ['12313','12312313','12312313']; 
var params = { 
     TableName: 'apps', 
     IndexName: 'state-app_id-index', 
     KeyConditions: [ 
      DynamoDB.Condition("state", "EQ", "active"), 
      DynamoDB.Condition("id", "IN", ids) 
     ] 
    }; 

    DynamoDB.query(params, function(error, response) {}); 

Der Fehler I bin immer wie folgt:

Validation: Ein oder mehrere Parameterwerte waren ungültig: ComparisonOperator IN ist nicht gültig für L AttributValue Typ

Antwort

3

KeyConditions unterstützt dienichtBetreiber. Die Dokumentation für KeyCondition sagt, was Betreiber es unterstützt:

Für KeyConditions nur die folgenden Vergleichsoperatoren sind unterstützt:

EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN

Der EQ Operator funktioniert nur für einen einzigen Wert auch:

  • EQ: Gleich.

    AttributeValueList kann nur ein Attribute vom Typ String, Zahl oder Binary (kein Satztyp) enthalten. Wenn ein Element ein AttributeValue-Element eines anderen als des in der Anforderung angegebenen Typs enthält, stimmt der Wert nicht überein. Zum Beispiel ist {"S":"6"} nicht gleich {"N":"6"}. Auch {"N":"6"} ist nicht gleich {"NS":["6", "2", "1"]}.

Die Einschränkungen sind im Grunde das gleiche für KeyConditionExpression, welche die neuere ist, empfohlen, auf Tasten zum Filtern. Hier ist ein Ausschnitt aus der Dokumentation (Hervorhebung von mir):

Die Bedingung muss einen Gleichheitstest auf einem einzelnen Hash ausführen Schlüssel Wert. Die Bedingung kann auch einen von mehreren Vergleichstests mit einem einzelnen Bereichsschlüsselwert durchführen. Abfrage kann KeyConditionExpression zu abrufen ein Element mit einem bestimmten Hash und Bereichsschlüsselwert oder mehr Elementen verwenden, die den gleichen Hash-Schlüsselwert haben, aber unterschiedlichen Bereich Schlüsselwerte

In Ihrem Fall könnten Sie bauen Sie die FilterExpression in ähnlicher Weise wie in this answer beschrieben aus.

+1

Ich bin nach der gleichen Sache, aber nach Ihrem Link 'A FilterExpression erlaubt keine Schlüsselattribute. Sie können einen Filterausdruck nicht basierend auf einem Partitionsschlüssel oder einem Sortierschlüssel definieren.' Also zurück auf Platz eins. –

1

Die einzige Möglichkeit, die IN-Anweisung zu verwenden, besteht darin, eine Filterbedingung zu verwenden. Der Filterausdruck kann jedoch nur Attribute für nicht primäre Schlüssel enthalten. So die Abfrage, die Sie erreichen möchten, ist NICHT mit Primärschlüssel möglich. So etwas wie diese

var params = { 
    TableName: 'apps', 
    ... 
    FilterExpression: "#id IN (:one,:two)",: 
... 

ist nur mit Nicht-Primärschlüsselattribut

Die Abhilfe Sie anwenden können, wird die Partie mit bekommen item Daher statt in einem Aufruf einer Abfrage Ausgabe Multiples Ausgabe und jede Bedingung soll einen Wert von Ihrem ID-Array enthalten.

Wenn es sich um Batch-Get-Artikel handelt, beachten Sie die Lesekapazitätseinheiten (batch get item in node.js).