如何查询 DynamoDB 按列表中的值过滤

2024-01-10

数据库中共有三项:

[
  {
    "year": 2013,
    "info": {
      "genres": ["Action", "Biography"]
    }
  },
  {
    "year": 2013,
    "info": {
      "genres": ["Crime", "Drama", "Thriller"]
    }
  },
  {
    "year": 2013,
    "info": {
      "genres": ["Action", "Adventure", "Sci-Fi", "Thriller"]

    }
  }
]

随着year属性是表的主键我可以继续使用FilterExpression精确匹配list value ["Action", "Biography"]:

var params = {
    TableName : TABLE_NAME,
    KeyConditionExpression: "#yr = :yyyy",
    FilterExpression: "info.genres = :genres",
    ExpressionAttributeNames:{
        "#yr": "year"
    },
    ExpressionAttributeValues: {
        ":yyyy": 2013,
        ":genres": ["Action", "Biography"]
    }     
};
var AWS = require("aws-sdk");
var docClient = new AWS.DynamoDB.DocumentClient();


let promise = docClient.query(params).promise();
promise.then(res => {
console.log("res:", res);
})

而不是匹配整个列表["Action", "Biography"]我宁愿进行查询以仅返回那些存储在项目的列表中包含字符串“Biography”的表项目info.genres场地。我想知道这是否可以使用 DynamoDBquery API?

后来编辑了。

工作解决方案(感谢Balu)是使用QueryFilter contains比较运算符:

var params = {
    TableName: TABLE_NAME,
    Limit: 20,
    KeyConditionExpression: "id = :yyyy",
    FilterExpression: `contains(info.genres , :qqqq)`,
    ExpressionAttributeValues: {
      ":qqqq": { S: "Biography" },
      ":yyyy": { N: 2013 },
    },
  }

let promise = docClient.query(params).promise();
promise.then(res => {
console.log("res:", res);
})

我们可以用contains在过滤表达式中而不是=.

So, "info.genres = :genres"可以改为contains(info.genres , :gnOne)

在应用过滤器之前,AWS 仍将在分区键上进行查询,在单个查询中提取最多 1 MB 的数据。因此,我们将使用带有或不带有过滤器表达式的相同 RCU 来收费,但返回到客户端的数据量将受到限制,因此仍然有用。

const dynamodb = new AWS.DynamoDB();
dynamodb.query(
  {
    TableName: "my-test-table",
    Limit: 20,
    KeyConditionExpression: "id = :yyyy",
    FilterExpression: `contains(info.genres , :gnOne)`,
    ExpressionAttributeValues: {
      ":gnOne": { S: "Biography" },
      ":yyyy": { S: "2020" },
    },
  },
  function (err, data) {
    if (err) console.error(err);
    else console.log("dynamodb scan succeeded:", JSON.stringify(data, null, 2));
  }
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查询 DynamoDB 按列表中的值过滤 的相关文章

随机推荐