2017-08-25 6 views
0

私はこのデータを格納するDynamoDBテーブルを持っています。 「デバイス」は、パーティション・キーと「日時」ソートキーである配列内のネストされた属性に基づくフィルタ式 - DynamoDB

JSON data

。 私は、PartitionKeyと日付の範囲(ソートキー)に基づいてデータを照会することができます。しかし今、私は配列である "データ"の内側にある "終点"に基づいてフィルタリングする必要があります。たとえば、エンドポイント1がデータ配列に存在する場合、またはエンドポイントIN(1,3)が存在する場合などにのみ、データを取得したいと考えています。 次のコードを使用しています。

var dev = event.params.querystring.device;  
 
var from = event.params.querystring.from; 
 
var to = event.params.querystring.to; 
 
var ascord = event.params.querystring.ascord; 
 
var limit = event.params.querystring.limit; 
 

 
    
 
var qryParams = { 
 
    TableName : "mytable", 
 
    KeyConditionExpression: "#id = :dddd and #tm between :time1 and :time2", 
 
    FilterExpression: "data.endpoint = :ep", 
 
    ExpressionAttributeNames:{ 
 
     "#id": "device", 
 
     "#tm": "datetime" 
 
    }, 
 
    ExpressionAttributeValues: { 
 
     ":dddd": dev, 
 
     ":time1": from, 
 
     ":time2": to, 
 
     ":ep": 1 
 
    } 
 
}; 
 

 
docClient.query(qryParams, function(err, data){ 
 
    if (err){ 
 
     callback(err, null); 
 
    }else { 
 
     callback(null, data); 
 
    } 
 
})

しかし、それはすべてのレコードを取得しません。また、プレースホルダ(#data。#endpoint)を使用しようとしましたが動作しませんでした。 正しい方法は何でしょうか? また、エンドポイントのテーブルにインデックスを作成する必要がありますか?

ありがとうございました。よろしくお願いいたします。 よろしくお願いします。 Gus

答えて

0

属性dataは、オブジェクトのリストです。したがって、listo属性の配列インデックスを指定しないと、DynamoDBはアイテムを見つけることができません。 endpointvalueの値を知っている場合は、contains関数を使用できます。

オプション1 - 使用して含まれています -

var params = { 
    TableName: table, 
    KeyConditionExpression: "#id = :dddd and #tm between :time1 and :time2", 
    FilterExpression: "contains (#data, :ep)", 
    ExpressionAttributeNames: { 
     "#id": "deviceid", 
     "#tm": "datetime", 
     "#data" : "data" 
    }, 
    ExpressionAttributeValues: { 
     ":dddd": "1", 
     ":time1": "2017-08-22T00:44:11:424Z", 
     ":time2": "2017-08-22T23:44:11:424Z", 
     ":ep": { 
      "endpoint": 1, 
      "value": "23" 
     } 
    } 
}; 

をオプション2 - 索引を使用: -

var params = { 
    TableName: table, 
    KeyConditionExpression: "#id = :dddd and #tm between :time1 and :time2", 
    FilterExpression: "#data"+"[0].endpoint = :ep", 
    ExpressionAttributeNames: { 
     "#id": "deviceid", 
     "#tm": "datetime", 
     "#data" : "data" 
    }, 
    ExpressionAttributeValues: { 
     ":dddd": "1", 
     ":time1": "2017-08-22T00:44:11:424Z", 
     ":time2": "2017-08-22T23:44:11:424Z", 
     ":ep": 1 
    } 
}; 
関連する問題