Amazon web services Dynamodb查询:使用筛选器表达式获取匹配的对象

Amazon web services Dynamodb查询:使用筛选器表达式获取匹配的对象,amazon-web-services,amazon-dynamodb,dynamodb-queries,Amazon Web Services,Amazon Dynamodb,Dynamodb Queries,我的数据存储在DynamoDB中的表“mysettings”中,模式如下:“pk”作为散列键,“sk”作为范围键 示例数据项: { "mSettings": { "gflag": true, "name": "green", "type": "B" }, "pk": "Group1", "sk": "A1000", "xSettings": { "gflag": false, "name": "blue", "type": "A

我的数据存储在DynamoDB中的表“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字段为真的设置。 与上面的示例项类似,它应该只返回“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过滤器在项目级别运行。它们决定是否将项目返回给您。它们不能用于控制返回给您的属性组。您可以在客户端轻松地使用查询结果完成这项工作

下面是一个后处理查询结果对象以删除子对象的示例,其中
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' }
}