簡體   English   中英

nodejs DynamoDB 按映射項掃描

[英]nodejs DynamoDB Scan by Mapped Items

我有一個 DynamoDB 表,我想在其中返回 Review.ID 映射值等於 123 的所有項目。

Item: {
  id: 1,
  review: {
    Id: 123,
    step1: 456,
    step2: 789,
    step3: 1234,
    },
  // Add more items here
},
Item: {
  id: 2,
  review: {
    Id: 123,
    step1: 999,
    step2: 888,
    step3: 777,
    },
  // Add more items here
},

理想回報示例:

id: 1,
review: {
 - id: 123,
 - step: 456,
 - step2: 789,
 - step3: 1234,
}
id: 2,
review: {
  - id: 123,
 - step: 999,
 - step2: 888,
 - step3: 777,
}

這是我在 NodeJS 中的當前代碼

exports.handler = async (event, context, callback) => {

 const params = {
    FilterExpression: "review.Id = :review",
    ExpressionAttributeValues: {
        ":review": 123,
    },
  TableName: "sometable"
 };


   let promise = dynamoDb.scan(params).promise();
   let result = await promise;
   let data = result.Items;
    if (result.LastEvaluatedKey) {
        params.ExclusiveStartKey = result.LastEvaluatedKey;
        data = data.concat(await (params));
    }


    // create a response
      const response = {
      statusCode: 200,
      body: JSON.stringify(data),
    };
    callback(null, response);

};

運行此代碼,我得到一個空結果 []。

對此的任何幫助將不勝感激。

您尚未顯示所有代碼,但我建議問題在於您的dynamoDb客戶端是低級DynamoDB Client而不是高級Document Client 他們使用不同的方式提供屬性值。 您正在使用低級別 DynamoDB 客戶端,但指示屬性值就像您正在使用高級文檔客戶端一樣。

這是一個對比兩種客戶端方法的示例:

const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });

// High-level Document Client
const dc = new AWS.DynamoDB.DocumentClient();

// High-level scan parameters for Document Client
const paramsDC = {
  FilterExpression: "review.Id = :review",
  ExpressionAttributeValues: {
    ":review": 123,
  },
  TableName: "sometable"
};

// Low-level DynamoDB Client
const db = new AWS.DynamoDB();

// Low-level scan parameters for DynamoDB Client
const paramsDB = {
  FilterExpression: "review.Id = :review",
  ExpressionAttributeValues: {
    ":review": { "N": "123" },
  },
  TableName: "sometable"
};

(async() => {
  // High-level scan
  const resultDC = await dc.scan(paramsDC).promise();
  console.log('DC Items:', JSON.stringify(resultDC.Items));

  // Low-level scan
  const resultDB = await db.scan(paramsDB).promise();
  console.log('DB Items:', JSON.stringify(resultDB.Items));
})();

這導致:

DC Items: [{"review":{"step":999,"id":123},"id":2},{"review":{"step":456,"id":123},"id":1}]
DB Items: [{"review":{"M":{"step":{"N":"999"},"id":{"N":"123"}}},"id":{"N":"2"}},{"review":{"M":{"step":{"N":"456"},"id":{"N":"123"}}},"id":{"N":"1"}}]

請注意,低級別 DynamoDB 客戶端響應看起來有些不同,但實際上只是相同結果的不同(未編組)表示。 它包括"id":{"N":"1"} ,它表示id是一個值為1的數字,其中 Document Client 顯示"id":1 低級結果包括"M": {... }這是映射,而高級文檔客戶端會自動為您將這些解組為 JavaScript 對象。

底線:

  • 文檔客戶端較新
  • 文檔客戶端對 JavaScript 本機對象的數據進行編組和解組
  • 使用文檔客戶端

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM