是否可以使用 javascript SDK 从 amazon Dynamodb 查询 JSON 数据

Is it possible to query JSON data from amazon Dynamodb using javascript SDK

我需要有关亚马逊 Dynamo 的帮助。我正在寻找 dynamodb

中的特殊查询

我的JSON看下面

{
  blocknumber: '20',
  BusinessData: {
    BASE_UNIT: 'kg',
    FARMERID: 'FAINKABR0001',
    FARMLOCATION: 'Farm 3927',
    GAPINFO: {},
    PLANTINGDATE: '2020-11-02T18:30:00.000Z',
    PRODUCEQUANTITES: [
      {
        name: 'Priya',
        qty: 200
      }
    ],
    SELECTED_UNIT: {
      NAME: 'kg'
    }
  },
  chaincodeID: 'producechaincode',
  docType: 'Produce',
  PRID: 'PRFAINKABR0007',
  PRODUCE: 'Sweetcorn',
  STATUS: 'Approved',
  timestamp: '2020-12-06T13:03:08.857Z'
}

我想查询 FARMERID 为 'FAINKABR0001' 的所有数据(生产)。 我浏览了所有示例,但似乎我只能查询哈希键、排序键和使用 GSI。 可以用AWS的JavascriptSDK查询吗?

提前致谢

DynamoDB 中的 Query 操作根据主键值查找项目。您可以查询任何具有复合主键(分区键和排序键)的 table 或二级索引 (GSI)。

现在对于你的问题,你有两个选择:
选项 1

  • FARMERID 设为您的 GSI

选项 2

  • 使用Scan方法过滤结果

现在您需要根据您的需要进行成本评估。每种方法都有自己的优点和缺点。

PFB 一些参考文献:

Scan-JS SDK

Query-DDB

根据评论,一种方法可能是

var data = 
[
    {
  blocknumber: '20',
  BusinessData: {
    BASE_UNIT: 'kg',
    FARMERID: 'FAINKABR0001',
    FARMLOCATION: 'Farm 3927',
    GAPINFO: {},
    PLANTINGDATE: '2020-11-02T18:30:00.000Z',
    PRODUCEQUANTITES: [
      {
        name: 'Priya',
        qty: 200
      }
    ],
    SELECTED_UNIT: {
      NAME: 'kg'
    }
  },
  chaincodeID: 'producechaincode',
  docType: 'Produce',
  PRID: 'PRFAINKABR0007',
  PRODUCE: 'Sweetcorn',
  STATUS: 'Approved',
  timestamp: '2020-12-06T13:03:08.857Z'
},
{
  blocknumber: '20',
  BusinessData: {
    BASE_UNIT: 'kg',
    FARMERID: 'FAINKABR0002',
    FARMLOCATION: 'Farm 3927',
    GAPINFO: {},
    PLANTINGDATE: '2020-11-02T18:30:00.000Z',
    PRODUCEQUANTITES: [
      {
        name: 'Priya',
        qty: 200
      }
    ],
    SELECTED_UNIT: {
      NAME: 'kg'
    }
  },
  chaincodeID: 'producechaincode',
  docType: 'Produce',
  PRID: 'PRFAINKABR0007',
  PRODUCE: 'Sweetcorn',
  STATUS: 'Approved',
  timestamp: '2020-12-06T13:03:08.857Z'
},

{
  blocknumber: '20',
  BusinessData: {
    BASE_UNIT: 'kg',
    FARMERID: 'FAINKABR0001',
    FARMLOCATION: 'Farm 3927',
    GAPINFO: {},
    PLANTINGDATE: '2020-11-02T18:30:00.000Z',
    PRODUCEQUANTITES: [
      {
        name: 'Priya',
        qty: 200
      }
    ],
    SELECTED_UNIT: {
      NAME: 'kg'
    }
  },
  chaincodeID: 'producechaincode',
  docType: 'Produce',
  PRID: 'PRFAINKABR0007',
  PRODUCE: 'Sweetcorn',
  STATUS: 'Approved',
  timestamp: '2020-12-06T13:03:08.857Z'
}
];

function filterResponse(data, id) {
  for(var i = 0; i < data.length; i++) {
    if(data[i].BusinessData.FARMERID === id ) {
      console.log(data[i]);
    }
  }
}

filterResponse(data, "FAINKABR0001");

感谢@Atul Kumar 的帮助我也添加了我的整个代码我将来会有人遇到同样的问题 这里 FilterExpression 为 FilterExpression: "BusinessData.FARMERID = :farmeridvalue"

这里我们需要给 FilterExpression 值我们想要查询的属性,即 BusinessData.FARMERID 并像我给的那样给出一个名称 farmeridvalue 现在你已经将 ExpressionAttributeValues 设置为我的搜索值作为 FAINKABR0001

完整扫码如下

var params = {
    TableName: "Your_tableName",
    FilterExpression: "BusinessData.FARMERID = :farmeridvalue",
    ExpressionAttributeValues: {
        ":farmeridvalue" :"FAINKABR0001"

    }
};

docClient.scan(params, onScan);

function onScan(err, data) {
    if (err) {
        console.error("Unable to scan the table. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        // print all the movies
        console.log("Scan succeeded.", data);
        data.Items.forEach(function(Block) {
           console.log( "result",
                Block.docType + ": ",
                Block.timestamp, "- rating:",  Block.BusinessData.FARMERID);
        });

        // continue scanning if we have more movies, because
        // scan can retrieve a maximum of 1MB of data
        if (typeof data.LastEvaluatedKey != "undefined") {
            console.log("Scanning for more...");
            params.ExclusiveStartKey = data.LastEvaluatedKey;
            docClient.scan(params, onScan);
        }
    }
}