Dynamodb 查询:使用过滤器表达式获取匹配的对象

Dynamodb Query : get matched objects with filter expression

我的数据存储在 DynamoDB 的 table "mysettings" 中,架构如下:"pk" 作为散列键,"sk" 作为范围键

示例数据项:

{
  "mSettings": {
    "gflag": true,
    "name": "green",
    "type": "B"
  },
  "pk": "Group1",
  "sk": "A1000",
  "xSettings": {
    "gflag": false,
    "name": "blue",
    "type": "A"
  },
  "ySettings": {
    "gflag": false,
    "name": "green",
    "type": "B"
  },
  "zSettings": {
    "gflag": true,
    "name": "red",
    "type": "A"
  }
}

现在,我在这里尝试仅获取(过滤)我的 gflag 字段为真的那些设置。 与上面的示例项目一样,它应该 return 只有 "mSettings" & "zSettings" 个节点。

下面是我试过的示例代码:

      var AWS = require('aws-sdk');
      let region = "us-east-1";
      AWS.config.region = region;
      var docClient = new AWS.DynamoDB.DocumentClient();

      let settingsItem = ["mSettings", "xSettings", "ySettings", "zSettings"];

      let params = {
          TableName: "mysettings",
          KeyConditionExpression: "#pk = :pk AND #sk = :sk",
          ExpressionAttributeNames:{
              "#pk": "pk",
              "#sk": "sk"
          },
         // FilterExpression : "ySettings.gflag = :gflag",
          ExpressionAttributeValues: {
              ":pk": 'Group1',
              ":sk": 'A1000',
              ":gflag" : true
          }     
       };

       //for(let settings in settingsItem){
       //   params['FilterExpression'] = settingsItem[settings] + ".gflag = :gflag";
       //}

      console.log('params = ', params)
      docClient.query(params, function(err, data){
          if(err){
              console.log(err)
          }
          console.log('data = ', data)    
      })

建议只检索标志值为 true 的对象。

DynamoDB 过滤器在项目级别运行。他们决定是否将物品退还给您。它们不能用于控制返回给您的属性组。您可以轻松地在客户端使用查询结果。

下面是一个 post 的示例 - 处理查询结果对象以删除 gflag 不正确的子对象:

const _ = require('lodash');

function gflag_true(value, key) {
  return _.isObject(value) && value.gflag;
}

const item = {
  "mSettings": { "gflag": true, "name": "green", "type": "B" },
  "pk": "Group1",
  "sk": "A1000",
  "xSettings": { "gflag": false, "name": "blue", "type": "A" },
  "ySettings": { "gflag": false, "name": "green", "type": "B" },
  "zSettings": { "gflag": true, "name": "red", "type": "A" }
}

// transform item returned from DocumentClient query method
const rc = _.pickBy(item, gflag_true)

这导致:

{
  mSettings: { gflag: true, name: 'green', type: 'B' },
  zSettings: { gflag: true, name: 'red', type: 'A' }
}