Как искать в DynamodB с комплексным значением, используя. net SDK - PullRequest
0 голосов
/ 10 апреля 2020

Я только начал с DynamoDB. У меня есть опыт работы в MongoDB и реляционных базах данных, и я структурирую JSON больше как структуру графа, чем как плоскую структуру. Например,

[
  {
    "id": "1",
    "title": "Castle on the hill",
    "lyrics": "when i was six years old I broke my leg",
    "artists": [
        {
            "name": "Ed Sheeran",
            "sex": "male"
        }
    ]
  }
]

Например, если мне нравится искать предмет по «Эд Ширан». Самое близкое, что у меня есть, это, и это даже не соответствует ни одному значению.

var request = new ScanRequest
{
  TableName = "Table",
  ProjectionExpression = "Id, Title, Artists",
  ExpressionAttributeValues = new Dictionary<string,AttributeValue>
  {
    { ":artist", new AttributeValue { M = new Dictionary<string, AttributeValue> 
            {
                { "Name", new AttributeValue { S = "Ed Sheeran" }}
            } 
        } 
    }
  },
  ExpressionAttributeNames = new Dictionary<string, string>
  {
    { "#artist", "Artists" },
  },
  FilterExpression = "#artist = :artist",
};

var result = await client.ScanAsync(request);

В большинстве примеров и обучающих программ, которые я наблюдал до сих пор, они рассматривали Dynamodb как таблицу в обычной реляционной базе данных с очень плоский дизайн Я делаю неправильно, чтобы структурировать JSON, как указано выше? Должны ли художники быть в отдельной таблице?

И если это возможно, как выполнить поиск по некоторому значению в сложном типе, как в приведенном выше примере?

1 Ответ

0 голосов
/ 11 апреля 2020

Прежде всего, вы не должны использовать операцию сканирования в DynamodB. Я настоятельно рекомендую использовать запрос. Посмотрите на это переполнение стека вопрос в первую очередь. Если вы хотите выполнить поиск по любому атрибуту, вы можете пометить его как первичный ключ (hash_key или hash_key + sort_key) или создать индекс для поля, к которому вы хотите выполнить запрос.

В зависимости от варианта использования атрибута id в вашей схеме, если вы никогда не запрашиваете атрибута id, я бы порекомендовал структуру примерно так:

[
  {
    "artist_name" : "Ed Sheeran" // Hash Key
    "id": "1", // Sort Key (Assuming id is unique and combination of HK+SK is unique)
    "title": "Castle on the hill",
    "lyrics": "when i was six years old I broke my leg",
    "artists": [
        {
            "name": "Ed Sheeran",
            "sex": "male"
        }
    ]
  }
]

В качестве альтернативы, если вам также нужно запросить идентификатор и это должна быть клавиша ha sh, вы можете index в атрибуте artist_name и затем запросить его.

[
  {
    "artist_name" : "Ed Sheeran" // GSI Hash key
    "id": "1", // Table Hash key
    "title": "Castle on the hill",
    "lyrics": "when i was six years old I broke my leg",
    "artists": [
        {
            "name": "Ed Sheeran",
            "sex": "male"
        }
    ]
  }
]

В любом случае невозможно выполнить запрос внутри вложенного объекта, не используя операцию сканирования, а затем повторяя его в коде, что вы уже пробовали.

...