Dynamodb Query: получить совпавшие объекты с выражением фильтра - PullRequest
0 голосов
/ 04 февраля 2020

Мои данные хранятся в таблице "mysettings" в DynamoDB со следующей схемой: "pk" как ключ ha sh и "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 имеет значение true. Как и в приведенном выше примере элемента, он должен возвращать только узлы "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)    
      })

Пожалуйста, предложите получить только те объекты, для которых установлен флаг значение истинно.

1 Ответ

1 голос
/ 04 февраля 2020

Фильтры 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' }
}
...