DynamoDB JavaScript SDK v2 v3: query

Spread the love

L’operazione Query in DynamoDB trova gli elementi in base ai valori partendo dalla chiave primaria.

DynamoDB JavaScript SDK v2 and v3 query
DynamoDB JavaScript SDK v2 and v3 query

È necessario fornire il nome dell’attributo della chiave di partizione e un singolo valore per tale attributo. Query restituisce tutti gli elementi con quel valore della chiave di partizione. Facoltativamente, puoi fornire un attributo della chiave di ordinamento e utilizzare un operatore di confronto per perfezionare i risultati della ricerca.

Key Condition Expression

Per specificare i criteri di ricerca, si utilizza  una key condition expression, una stringa che determina gli elementi da leggere dalla tabella o dall’indice.

È necessario specificare il nome e il valore della chiave di partizione come condizione di uguaglianza.

Puoi facoltativamente fornire una seconda condizione per la chiave di ordinamento (se presente). La condizione della chiave di ordinamento deve utilizzare uno dei seguenti operatori di confronto:

  • a = b — vero se l’attributo  a è uguale al valore b
  • a < b — vero se  a è minore di b
  • a <= b — vero se  a è minore o uguale a b
  • a > b — vero se  a è maggiore di b
  • a >= b — vero se  a è maggiore o uguale a b
  • a BETWEEN b AND c — true se  a è maggiore o uguale a b e minore o uguale a  c.
  • begins_with (a, substr)— true se il valore dell’attributo  a inizia con una particolare sottostringa.

Quindi puoi specificare nella condizione dei parametri in questo modo:

    KeyConditionExpression: 'ItemId = :endpoint_category and begins_with(ItemName, :endpoint_sub_domain)',

l’attributo dell’espressione deve essere dichiarato in una sezione separata in modo da poter aggiungere questa sezione di dichiarazione

ExpressionAttributeValues: {
        ':vn': {N: '2'},
        ':endpoint_category' : {S: 'mischianti'},
        ':endpoint_sub_domain' : {S: 'mqtt'}
    },

dove è possibile specificare un nome di variabile da utilizzare nell’altra sezione.

Filtrare le espressioni per Query

Se è necessario perfezionare ulteriormente i risultati della Query, è possibile fornire facoltativamente un’espressione di filtro. Un’espressione di filtro  determina quali elementi all’interno dei risultati della Query devono essere rispediti al mittente. Tutti gli altri risultati vengono scartati.

Un’espressione di filtro viene applicata dopo un  Query finish, ma prima che vengano restituiti i risultati. Pertanto, una  Query avrà gli stessi tempi e occuperà le stesse risorse, indipendentemente dal fatto che sia presente un’espressione di filtro.

Un’operazione  Query può recuperare un massimo di 1 MB di dati . Questo limite si applica prima che l’espressione del filtro venga valutata.

Un’espressione di filtro non può contenere chiavi di partizione o attributi di chiavi di ordinamento . È necessario specificare tali attributi nell’espressione della condizione chiave, non nell’espressione del filtro.

La sintassi per un’espressione di filtro è identica a quella di un’espressione di condizione . Le espressioni di filtro possono utilizzare gli stessi comparatori, funzioni e operatori logici di un’espressione di condizione, con l’aggiunta dell’operatore di non uguale ( <>). (cit. Amazzonia)

Quindi per un filtro aggiuntivo puoi aggiungere una sezione come questa:

    FilterExpression: 'ValueNum > :vn',

dove ValueNum non è una chiave ma un attributo di dati .

Query sulla console AWS

Prima di controllare lo script in javascript diamo uno sguardo sulla console AWS, la stessa operazione può essere fatta con l’interfaccia Web.

  1. Vai alla pagina DynamoDB ;
  2. Seleziona Tabella nel menu a sinistra;
  3. Seleziona la scheda Articoli ;

o con questo url ma controlla la regione:

https://eu-west-1.console.aws.amazon.com/dynamodb/home?region=eu-west-1#tables:selected=TestTableMischianti;tab=items
  1. Nell’intestazione della Tabella puoi selezionare Aggiungi filtro ;
  2. Seleziona il tuo filtro e clicca su Inizia la ricerca .

Ora per ottenere una query che controlli:

  • ItemId (la categoria ): deve essere uguale a ‘mischianti’;
  • ItemName (url completa): inizia con ‘mqtt’;
  • ValueNum (livello del sottodominio): deve essere maggiore di 2.

Da console è abbastanza semplice, ecco l’immagine della selezione:

DynamoDB Interrogare la tabella dalla Web Console di AWS
DynamoDB Interrogare la tabella dalla Web Console di AWS

Script per interrogare la tabella

Ora eseguiremo lo script per interrogare la tabella da NodeJS.

Abbiamo già visto i parametri, qui la struttura json completa:

var params = {
    TableName: "TestTableMischianti",
    ExpressionAttributeValues: {
        ':vn': {N: '2'},
        ':endpoint_category' : {S: 'mischianti'},
        ':endpoint_sub_domain' : {S: 'mqtt'}
    },
    KeyConditionExpression: 'ItemId = :endpoint_category and begins_with(ItemName, :endpoint_sub_domain)',
    ProjectionExpression: 'ItemName, ValueStr',
    FilterExpression: 'ValueNum > :vn',
};
SDK v2

Ora lo script asincrono con SDK v2.

Per eseguire questo script vai nella cartella dynamodb-examples\jsv2 e lancia node items_query.js.

/*
 * DynamoDB Script Examples
 * Query items with DynamoDB
 * DB of selected region in AWS.config.update
 *
 * AUTHOR:  Renzo Mischianti
 *
 * https://mischianti.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2017 Renzo Mischianti www.mischianti.org All right reserved.
 *
 * You may copy, alter and reuse this code in any way you like, but please leave
 * reference to www.mischianti.org in your comments if you redistribute this code.
 */

var AWS = require("aws-sdk");

AWS.config.update({
    apiVersion: '2012-08-10',
    region: "eu-west-1",
    // endpoint: "http://localhost:8000",
    // // accessKeyId default can be used while using the downloadable version of DynamoDB.
    // // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead.
    // accessKeyId: "9oiaf7",
    // // secretAccessKey default can be used while using the downloadable version of DynamoDB.
    // // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead.
    // secretAccessKey: "yz5i9"
});

var ddb = new AWS.DynamoDB();

console.log("Start script!");

var params = {
    TableName: "TestTableMischianti",
    ExpressionAttributeValues: {
        ':vn': {N: '2'},
        ':endpoint_category' : {S: 'mischianti'},
        ':endpoint_sub_domain' : {S: 'mqtt'}
    },
    KeyConditionExpression: 'ItemId = :endpoint_category and begins_with(ItemName, :endpoint_sub_domain)',
    ProjectionExpression: 'ItemName, ValueStr',
    FilterExpression: 'ValueNum > :vn',
};


ddb.query(params, function (err, data) {
    if (err) {
        console.error("Unable ti get item", JSON.stringify(params, null, 2), ". Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("Get Item succeeded:", JSON.stringify(data, null, 2));
    }
});

console.log("End script!");

Ed ecco il risultato:

D:\Projects\AlexaProjects\dynamodb-management\dynamodb-examples\jsv2>node items_query.js
Start script!
End script!
Get Item succeeded: {
  "Items": [
    {
      "ItemName": {
        "S": "mqtt.home.mischianti.org"
      },
      "ValueStr": {
        "S": "MQTT test url mischianti"
      }
    }
  ],
  "Count": 1,
  "ScannedCount": 2
}

Nella risposta ci sono informazioni importanti oltre ai dati, the Count e ScannedCount, Count è il numero di risultati, ScannedCount è il numero di righe scansionate, questo parametro ti dà l’efficienza della tua query, è il numero di righe filtrate per chiave in cui stanno per applicare il filtro, meno è il numero più è l’efficienza.

Ora lo script sincrono node items_query_async_await.js.

/*
 * DynamoDB Script Examples
 * Query items with DynamoDB
 * DB of selected region in AWS.config.update
 *
 * AUTHOR:  Renzo Mischianti
 *
 * https://mischianti.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2017 Renzo Mischianti www.mischianti.org All right reserved.
 *
 * You may copy, alter and reuse this code in any way you like, but please leave
 * reference to www.mischianti.org in your comments if you redistribute this code.
 */

var AWS = require("aws-sdk");

AWS.config.update({
    apiVersion: '2012-08-10',
    region: "eu-west-1",
    // endpoint: "http://localhost:8000",
    // // accessKeyId default can be used while using the downloadable version of DynamoDB.
    // // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead.
    // accessKeyId: "9oiaf7",
    // // secretAccessKey default can be used while using the downloadable version of DynamoDB.
    // // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead.
    // secretAccessKey: "yz5i9"
});

var ddb = new AWS.DynamoDB();

(async function () {
    console.log("Start script!");

    var params = {
        TableName: "TestTableMischianti",
        ExpressionAttributeValues: {
            ':vn': {N: '2'},
            ':endpoint_category' : {S: 'mischianti'},
            ':endpoint_sub_domain' : {S: 'mqtt'}
        },
        KeyConditionExpression: 'ItemId = :endpoint_category and begins_with(ItemName, :endpoint_sub_domain)',
        ProjectionExpression: 'ItemName, ValueStr',
        FilterExpression: 'ValueNum > :vn',
    };

    try {
        const data = await ddb.query(params).promise();
        console.log("Get Item succeeded:", JSON.stringify(data, null, 2));
    }catch (err) {
        console.error("Unable ti get item", JSON.stringify(params, null, 2), ". Error JSON:", JSON.stringify(err, null, 2));
    }

    console.log("End script!");
})();

e il relativo output della console:

D:\Projects\AlexaProjects\dynamodb-management\dynamodb-examples\jsv2>node items_query_async_await.js
Start script!
Get Item succeeded: {
  "Items": [
    {
      "ItemName": {
        "S": "mqtt.home.mischianti.org"
      },
      "ValueStr": {
        "S": "MQTT test url mischianti"
      }
    }
  ],
  "Count": 1,
  "ScannedCount": 2
}
End script!

Puoi anche usare il DocumentClient per semplificare i parametri node items_query_doc_client_async_await.js:

/*
 * DynamoDB Script Examples
 * Query items with DynamoDB
 * DB of selected region in AWS.config.update
 *
 * AUTHOR:  Renzo Mischianti
 *
 * https://mischianti.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2017 Renzo Mischianti www.mischianti.org All right reserved.
 *
 * You may copy, alter and reuse this code in any way you like, but please leave
 * reference to www.mischianti.org in your comments if you redistribute this code.
 */

var AWS = require("aws-sdk");

AWS.config.update({
    apiVersion: '2012-08-10',
    region: "eu-west-1",
    // endpoint: "http://localhost:8000",
    // // accessKeyId default can be used while using the downloadable version of DynamoDB.
    // // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead.
    // accessKeyId: "9oiaf7",
    // // secretAccessKey default can be used while using the downloadable version of DynamoDB.
    // // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead.
    // secretAccessKey: "yz5i9"
});

var docClient = new AWS.DynamoDB.DocumentClient();

(async function () {
    console.log("Start script!");

    var params = {
        TableName: "TestTableMischianti",
        ExpressionAttributeValues: {
            ':vn': 2,
            ':endpoint_category' : 'mischianti',
            ':endpoint_sub_domain' : 'mqtt'
        },
        KeyConditionExpression: 'ItemId = :endpoint_category and begins_with(ItemName, :endpoint_sub_domain)',
        ProjectionExpression: 'ItemName, ValueStr',
        FilterExpression: 'ValueNum > :vn',
    };

    try {
        const data = await docClient.query(params).promise();
        console.log("Get Item succeeded:", JSON.stringify(data, null, 2));
    }catch (err) {
        console.error("Unable ti get item", JSON.stringify(params, null, 2), ". Error JSON:", JSON.stringify(err, null, 2));
    }

    console.log("End script!");
})();

anche l’output della console diventa più semplice.

D:\Projects\AlexaProjects\dynamodb-management\dynamodb-examples\jsv2>node items_query_doc_client_async_await.js
Start script!
Get Item succeeded: {
  "Items": [
    {
      "ItemName": "mqtt.home.mischianti.org",
      "ValueStr": "MQTT test url mischianti"
    }
  ],
  "Count": 1,
  "ScannedCount": 2
}
End script!

SDK v3

Ora lo script SDK v3 con l’implementazione consigliata.

Per eseguire questo script vai nella cartella dynamodb-examples\jsv3 e lancia node items_query_async_await.js.

/*
 * DynamoDB Script Examples v3
 * Query items with DynamoDB async await
 * DB of selected region in configDynamoDB
 *
 * AUTHOR:  Renzo Mischianti
 *
 * https://mischianti.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2017 Renzo Mischianti www.mischianti.org All right reserved.
 *
 * You may copy, alter and reuse this code in any way you like, but please leave
 * reference to www.mischianti.org in your comments if you redistribute this code.
 */

const { DynamoDBClient, QueryCommand } = require("@aws-sdk/client-dynamodb");
const configDynamoDB = {
    version: 'latest',
    region: "eu-west-1",
    // endpoint: "http://localhost:8000",
    // credentials: {
    //     // accessKeyId default can be used while using the downloadable version of DynamoDB.
    //     // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead.
    //     accessKeyId: "9oiaf7",
    //     // secretAccessKey default can be used while using the downloadable version of DynamoDB.
    //     // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead.
    //     secretAccessKey: "yz5i9"
    //
    // }
};

const dbClient = new DynamoDBClient(configDynamoDB);

(async function () {
    console.log("Start script!");

    var params = {
        TableName: "TestTableMischianti",
        ExpressionAttributeValues: {
            ':vn': {N: '2'},
            ':endpoint_category' : {S: 'mischianti'},
            ':endpoint_sub_domain' : {S: 'mqtt'}
        },
        KeyConditionExpression: 'ItemId = :endpoint_category and begins_with(ItemName, :endpoint_sub_domain)',
        ProjectionExpression: 'ItemName, ValueStr',
        FilterExpression: 'ValueNum > :vn',
    };

    try {
        const command = new QueryCommand(params);
        const data = await dbClient.send(command);
        console.log("PutItem succeeded:", JSON.stringify(params, null, 2), JSON.stringify( data, null, 2),);
    }catch (err) {
        console.error("Unable add item", JSON.stringify(params, null, 2), ". Error JSON:", JSON.stringify(err, null, 2));
    }

    console.log("End script!");
})();

Ed ecco la console di output

D:\Projects\AlexaProjects\dynamodb-management\dynamodb-examples\jsv3>node items_query_async_await.js
Start script!
PutItem succeeded: {
  "TableName": "TestTableMischianti",
  "ExpressionAttributeValues": {
    ":vn": {
      "N": "2"
    },
    ":endpoint_category": {
      "S": "mischianti"
    },
    ":endpoint_sub_domain": {
      "S": "mqtt"
    }
  },
  "KeyConditionExpression": "ItemId = :endpoint_category and begins_with(ItemName, :endpoint_sub_domain)",
  "ProjectionExpression": "ItemName, ValueStr",
  "FilterExpression": "ValueNum > :vn"
} {
  "$metadata": {
    "httpStatusCode": 200,
    "httpHeaders": {
      "server": "Server",
      "date": "Wed, 03 Feb 2021 09:20:04 GMT",
      "content-type": "application/x-amz-json-1.0",
      "content-length": "128",
      "connection": "keep-alive",
      "x-amzn-requestid": "5KF74ED811JMPF7UQHEGII73LFVV4KQNSO5AEMVJF66Q9ASUAAJG",
      "x-amz-crc32": "4135422727"
    },
    "requestId": "5KF74ED811JMPF7UQHEGII73LFVV4KQNSO5AEMVJF66Q9ASUAAJG",
    "attempts": 1,
    "totalRetryDelay": 0
  },
  "Count": 1,
  "Items": [
    {
      "ItemName": {
        "S": "mqtt.home.mischianti.org"
      },
      "ValueStr": {
        "S": "MQTT test url mischianti"
      }
    }
  ],
  "ScannedCount": 2
}
End script!

Grazie

Ora hai tutti gli strumenti per interrogare, gestire, creare la tua tabella in ambiente AWS.

  1. DynamoDB JavaScript SDK v2 v3: prerequisiti ed introduzione
  2. DynamoDB JavaScript SDK v2 v3: gestione delle tabelle
  3. DynamoDB JavaScript SDK v2 v3: aggiungere elementi con DB o DocumentClient
  4. DynamoDB JavaScript SDK v2 v3: gestione degli elementi
  5. DynamoDB JavaScript SDK v2 v3: scansionare i dati delle tabelle e paginazione
  6. DynamoDB JavaScript SDK v2 v3: query

Spread the love

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *