扫描DynamoDB表时ProjectionExpression指定的colors列无返回结果
为什么DynamoDB Scan操作只返回userId而不返回colors?
先看你的返回结果:
{ Items: [ { userId: 'amzn1.ask.account.XYZ' } ], Count: 1, ScannedCount: 2 }
这个结果说明,匹配你过滤条件的那条数据本身就没有colors字段——DynamoDB是无模式的NoSQL数据库,每个条目可以拥有不同的属性,如果你指定的ProjectionExpression里的字段在目标条目中不存在,它就不会出现在返回结果里。
接下来你可以按这几步排查:
先确认目标条目是否真的包含
colors字段
暂时去掉ProjectionExpression,执行一次完整的Scan,看看这条数据的完整结构:var docClient = new AWS.DynamoDB.DocumentClient(); var params = { "TableName": "myTable", "ExpressionAttributeValues": {":val": userId}, "FilterExpression": "userId = :val" }; console.log("Scanning full table entries."); docClient.scan(params, function(err, data){ if (err) console.log(err, err.stack); else console.log(data.Items); // 这里会输出完整的条目,检查是否有colors字段 });如果输出里还是没有
colors,那就是这条数据写入的时候就没加这个字段,得去检查数据写入的逻辑。检查字段名的拼写和大小写
DynamoDB的属性名是大小写敏感的,如果你表中实际的字段名是Colors(首字母大写),但你在ProjectionExpression里写的是colors,那也会找不到这个字段。确认一下表中的字段名和你代码里的完全一致。确认ProjectionExpression的语法是否正确
你的代码里ProjectionExpression写的是"colors, userId",语法是对的,没有逗号或者空格的问题,所以这部分大概率没问题。
总结一下:最可能的原因就是匹配条件的那条数据里根本不存在colors字段,先通过完整Scan确认这一点,再针对性解决数据写入的问题或者字段名匹配的问题。
内容的提问来源于stack exchange,提问作者qbas1409
相关产品推荐
相关产品推荐

