Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon dynamodb 从Boto3到DynamoDB中使用IN运算符_Amazon Dynamodb - Fatal编程技术网

Amazon dynamodb 从Boto3到DynamoDB中使用IN运算符

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",

我是DynamoDB新手,尝试根据字段的特定值列表来查询表

我有一个字段
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
                                 }
                    };
甚至像下面这样动态地传递到FilterExpression

var 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所在的表中选择*不仅效率较低,而且成本更高。此外,如果有人正在扫描主访问模式或辅助访问模式,那么他们确实需要重新评估他们的数据模型,以将其调整到他们的访问模式。现在,如果这是一种访问模式,只需要每隔一段时间进行一次,那么扫描的成本可能比维护二级索引更便宜。