我需要在DynamoDB上進行限制和條件掃描。爲什麼使用Limit和FilterExpression進行DynamoDB掃描不會返回符合過濾器要求的項目?
的docs說:
在響應,DynamoDB返回限制值的範圍內的所有匹配的結果。例如,如果您發出限值爲6且沒有過濾器表達式的查詢或掃描請求,則DynamoDB會返回表中與請求中指定的關鍵條件匹配的前六個項目(或者僅返回前六個項目掃描不帶過濾器的情況)。如果您還提供FilterExpression值,那麼DynamoDB將返回前六個中也與過濾器要求相匹配的項目(返回結果的數量將小於或等於6)。
的代碼(的NodeJS):
var params = {
ExpressionAttributeNames: {"#user": "User"},
ExpressionAttributeValues: {":user": parseInt(user.id)},
FilterExpression: "#user = :user and attribute_not_exists(Removed)",
Limit: 2,
TableName: "XXXX"
};
DynamoDB.scan(params, function(err, data) {
if (err) {
dataToSend.message = "Unable to query. Error: " + err.message;
} else if (data.Items.length == 0) {
dataToSend.message = "No results were found.";
} else {
dataToSend.data = data.Items;
console.log(dataToSend);
}
});
表XXXX定義:
- 主分區鍵:用戶(數量)
- 主排序關鍵字:標識符(字符串)
- INDEX:
- 指數名稱:RemovedIndex
- 類型:GSI
- 分區鍵:刪除(號碼)
- 排序鍵: -
- 屬性:ALL
在上面的代碼中,如果我刪除Limit
參數,DynamoDB將返回符合過濾器要求的項目。所以,條件是好的。但是當我用Limit
參數掃描時,結果是空的。
該XXXX表,有5個項目。只有2個第一個具有Removed
屬性。當我在沒有Limit
參數的情況下掃描時,DynamoDB將返回3個不帶Removed
屬性的項目。
我做錯了什麼?
謝謝你的回答!我不明白該文件,你向我澄清。你有關於如何在RDBMS中使用'limit'的提示嗎? –
對此有一些疑惑:https://github.com/clarkie/dynogels/issues/12這種有用的行爲如何?確定掃描,直到你有6個物品與過濾器相匹配,或者你到達表格的最後會更有用? – Clarkie
@Clarkie這很有用,因爲它允許您限制掃描操作評估的記錄數,這是出於性能原因。僅僅因爲它不像RDBMS一樣工作並不意味着它沒有用處。另外,你對Github的評論關於「對文檔所說的一些混淆」似乎對我不正確。文檔(正如我在我的回答中引用的)非常清楚。混淆來自那些認爲'limit'在DynamoDB中的工作方式與RDBMS中的方式相同,而無需花時間閱讀文檔。 –