Amazon dynamodb 从Boto3到DynamoDB中使用IN运算符
我是DynamoDB新手,尝试根据字段的特定值列表来查询表 我有一个字段Amazon dynamodb 从Boto3到DynamoDB中使用IN运算符,amazon-dynamodb,Amazon Dynamodb,我是DynamoDB新手,尝试根据字段的特定值列表来查询表 我有一个字段doc\u id,它也是一个二级索引,我想返回值列表中包含doc\u id的所有结果 我正在尝试这样的事情: response = table.query( IndexName='doc_id-index', FilterExpression=In(['27242226']) ) 但这显然是不对的 谁能给我指出正确的方向吗 谢谢 带有查询操作的 var params = { TableName : "tbl",
doc\u id
,它也是一个二级索引,我想返回值列表中包含doc\u id
的所有结果
我正在尝试这样的事情:
response = table.query(
IndexName='doc_id-index',
FilterExpression=In(['27242226'])
)
但这显然是不对的
谁能给我指出正确的方向吗
谢谢 带有查询操作的
var params = {
TableName : "tbl",
FilterExpression : "doc_id IN (:doc_id1, :doc_id2)",
ExpressionAttributeValues : {
":doc_id1" :100,
":doc_id2" :101
}
};
FilterExpression不允许使用键属性。不能基于分区键或排序键定义筛选器表达式
因此,您的doc\u id
字段是doc\u id-index
的分区键,不能在FilterExpression中使用
注意在已读取项目后应用FilterExpression;过滤过程不会消耗任何额外的读取容量单位 我假设您有另一个字段,如
userId
,只是为了演示如何在操作中实现
如果您有更多的userId,则应该动态地传递给FilterExpression
但在您的情况下,您可以使用扫描操作
var params = {
TableName : "tbl",
FilterExpression : "doc_id IN (:doc_id1, :doc_id2)",
ExpressionAttributeValues : {
":doc_id1" :100,
":doc_id2" :101
}
};
甚至像下面这样动态地传递到FilterExpressionvar documentsId = ["100", "101","200",...];
var documentsObj = {};
var index = 0;
documentsId.forEach((value)=> {
index++;
var documentKey = ":doc_id"+index;
documentsObj[documentKey.toString()] = value;
});
var params = {
TableName: 'job',
FilterExpression: 'doc_id IN ('+Object.keys(documentsObj).toString()+')',
ExpressionAttributeValues: documentsObj,
};
注意:使用扫描操作时要小心,效率低于查询。您是否在寻找类似于
从tbl1中选择id的内容,其中id位于(1、2、6、3、8)
是的,完全正确<代码>从(1、2、3、4)中的文档id所在的表中选择*不仅效率较低,而且成本更高。此外,如果有人正在扫描主访问模式或辅助访问模式,那么他们确实需要重新评估他们的数据模型,以将其调整到他们的访问模式。现在,如果这是一种访问模式,只需要每隔一段时间进行一次,那么扫描的成本可能比维护二级索引更便宜。