1

我在这个领域相当新,任何帮助表示赞赏

我在 Dynamodb 数据库中有一个名为 Tenant 的表,如下所示:“TenantId”是哈希主键,我没有其他键。我有一个名为“IsDeleted”的字段,它是布尔值

表结构

我正在尝试运行查询以获取未删除指定“TenantId”的记录(“IsDeleted == 0”)

我可以通过运行以下代码得到正确的结果:(返回 0 项)

       var filter = new QueryFilter("TenantId", QueryOperator.Equal, "2235ed82-41ec-42b2-bd1c-d94fba2cf9cc");
        filter.AddCondition("IsDeleted", QueryOperator.Equal, 0);

        var dbTenant = await
            _genericRepository.FromQueryAsync(new QueryOperationConfig
            {
                Filter = filter
            }).GetRemainingAsync();

但是当我尝试使用以下代码片段获取它时没有运气(它返回也被删除的项目)(返回 1 个项目)

 var queryFilter = new List<ScanCondition>();
        var scanCondition = new ScanCondition("IsDeleted", ScanOperator.Equal, new object[]{0});
        queryFilter.Add(scanCondition);


        var dbTenant2 = await
            _genericRepository.LoadAsync("2235ed82-41ec-42b2-bd1c-d94fba2cf9cc", new DynamoDBOperationConfig
            {
             QueryFilter   = queryFilter,
             ConditionalOperator = ConditionalOperatorValues.And
            });

知道为什么 ScanCondition 没有效果吗?

后来我也试过这个:(抛出异常)

            var dbTenant2 = await
            _genericRepository.QueryAsync("2235ed82-41ec-42b2-bd1c-d94fba2cf9cc", new DynamoDBOperationConfig()
            {
                QueryFilter = new List<ScanCondition>()
                {
                    new ScanCondition("IsDeleted", ScanOperator.Equal, 0)
                }
            }).GetRemainingAsync();

它抛出:“消息”:“必须为表租户定义一个范围键或 GSI 索引”

为什么它抱怨范围键或索引?我打电话

public AsyncSearch<T> QueryAsync<T>(object hashKeyValue, DynamoDBOperationConfig operationConfig = null);
4

1 回答 1

3

您根本无法查询仅给出单个主键(仅哈希键)的表。因为该主键只有一项且只有一项。的结果Query仍然是那个单项,实际上是Load操作 not Query。在这种情况下,您只能查询您是否具有复合主键(哈希(TenantID)和范围键)或 GSI(不强制键唯一性因此接受索引上的重复键)。

第二个代码尝试过滤Load. 有描述DynamoDBOperationConfig...QueryFilter

    // Summary:
    //     Query filter for the Query operation operation. Evaluates the query results and
    //     returns only the matching values. If you specify more than one condition, then
    //     by default all of the conditions must evaluate to true. To match only some conditions,
    //     set ConditionalOperator to Or. Note: Conditions must be against non-key properties.

所以只适用于Query操作

编辑:所以在阅读了您对此的评论之后......

我认为没有conditional expressions读取操作。AWS 文档表明它们用于putupdate操作。但是,我对此并不完全确定,因为我从来不需要做有条件的Load. 一般来说,没有像CheckIfExists功能这样的东西。您必须阅读该项目并查看它是否存在。条件加载仍将消耗读取吞吐量,因此您唯一的优势只是不检索它,换句话说,节省了带宽(这对于单个项目来说非常微不足道)。

我的建议是阅读它并在您的应用程序层中对其进行过滤。不要查询它。但是,您还可以做的是,如果您非常需要它,您可以将TenantId其用作 hashkey 和isDeletedrange 键。如果你这样做,你总是需要询问何时想要租客。通过查询,您可以将 rangeKey(isDeleted) 设置为 0 或 1。这不是我会做的。正如我所说,只需阅读它并在我的应用程序中过滤它。

isDeleted另一个建议可能是在现场设置 GSI并null0. 这样,您只能在表中看到该属性1。此类属性上的 GSI 称为sparse index. 稍后,如果您需要获取所有已删除的租户(isDeleted=1),您可以简单地扫描整个索引而无需条件。当您编写 null 时,它的0dynamoDB 不会首先将其放入索引中。

于 2018-03-23T06:43:20.553 回答