【问题标题】:Dynamodb - get all the items using IN operator ['shirt','pant'] , JsDynamodb - 使用 IN 运算符 ['shirt','pant'] 获取所有项目,Js
【发布时间】:2021-08-19 15:56:57
【问题描述】:
const getItemDetailsInCart=(products)=>{
  const items={};
  Object.keys(products).forEach((item,index)=>{
    items[`:${item}${index}`]=item;
  });
  var getCartDetailParams = {
    TableName : "BorderFreeProducts",
    FilterExpression : "Id IN ("+Object.keys(items).toString()+ ")",
    ExpressionAttributeValues:{}
  };
  getCartDetailParams['ExpressionAttributeValues']=items;
  return ddb.scan(getCartDetailParams).promise();
}

我已经写过这样的扫描,但是如果产品数量增加,处理参数会增加。除了 IN 运算符,还有其他方法可以解决这个问题吗?

【问题讨论】:

    标签: node.js amazon-dynamodb in-operator


    【解决方案1】:

    根据经验,扫描您的桌子几乎总是一个糟糕的主意。不能保证性能(它们对大表不利),而且非常昂贵。 DynamoDB 在设计时并未考虑到扫描

    在您的情况下,您似乎正在寻找 BatchGetItem(假设您提到的 Id 是您的主键),您可以在其中使用单个查询从表中获取大量项目。

    【讨论】:

      【解决方案2】:

      您可以添加一个全局二级索引,例如 id-index,其分区键是 Id 属性,然后发出多个查询,每个 ID 一个。这将避免您必须扫描整个表,如果您只想要项目的子集,这将是低效的。

      这是一个例子:

      const AWS = require("aws-sdk");
      const client = new AWS.DynamoDB.DocumentClient({ region: "us-east-1" });
      
      (async () => {
        const ids = ["shirt", "pant"];
        const promises = [];
      
        ids.forEach(id => {
          promises.push(
            client
              .query({
                TableName: "BorderFreeProducts",
                IndexName: "id-index",
                KeyConditionExpression: "#id = :id",
                ExpressionAttributeNames: { "#id": "Id" },
                ExpressionAttributeValues: { ":id": id },
              })
              .promise()
          );
        });
      
        const results = await Promise.all(promises);
        console.log(results.map(result => result.Items).flat());
      })();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-24
        • 2022-10-17
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 2019-11-26
        • 1970-01-01
        相关资源
        最近更新 更多