DynamoDB: запрос для поиска элемента в массиве строк - PullRequest
0 голосов
/ 21 мая 2018

Возможно, я не совсем понимаю, как работают хеш / первичные ключи в DynamoDB, но я пытаюсь создать модель (используя Serverless + Dynogels / NodeJS) для службы сообщений.

Модель выглядит следующим образом:

const ConversationORM = dynogels.define('Conversation', {

  hashKey: 'id',

  timestamps: true,
  tableName: config.CONVERSATION_TABLE,

  schema: {

    id: Joi.string(),
    users: Joi.array(), // e.g. ['foo', 'bar', 'moo']
    messages: Joi.array()

  }
})

Как видите, users - это массив, в котором перечислены идентификаторы участников разговора.

Мне нужно создать сервис, который находит всеразговоры, в которых участвует пользователь. В MongoDB (с которым я гораздо больше знаком) я бы сделал что-то вроде:

Conversation.find({users: {"$in": ['foo']} }).then(.... 

Есть ли что-то подобное, что я могу сделать в DynamoDB?Это вызов API, который будет происходить довольно часто, поэтому я надеюсь сделать его максимально эффективным.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

В этом ответе учитывается комментарий к ответу Хантера Фрезера о том, что вы не хотите использовать сканирование.

При использовании Запрос вам необходимо указать один ключ раздела в поле.операция.В вашей схеме это будет означать разбиение по атрибуту userid, который является набором.Ключи разделов в DynamoDB должны быть скалярным атрибутом верхнего уровня.Поскольку идентификатор пользователя не является скалярным (это набор), вы не можете использовать этот атрибут в качестве индекса, и, следовательно, вы не можете сделать запрос для разговоров, частью которых является пользователь.

Если вам нужно выполнить этот запрос,Я бы предложил пересмотреть вашу схему.В частности, я бы предложил реализовать шаблон списка Смежность , который хорошо работает в базах данных, содержащих отношения многие-ко-многим.

Вы можете увидеть некоторые дополнительные примечания к статье выше, которую я написал для этого ответа Шаблон проектирования списка смежности MM DynamoDB

В вашем случае вы должны иметь:

  • Первичный ключ: ConversationID
  • Ключ сортировки: UserID
  • Первичный ключ GSI: идентификатор пользователя

Затем можно использовать первичный ключ GSI в запросе, чтобы вернуть все разговоры, частью которых является пользователь.

0 голосов
/ 21 мая 2018

Я не знаком с Dynogels или Serverless, но если он использует обычный API, это может сработать:

var params = {
    ExpressionAttributeNames: {
        "U": "users"
    },
    ExpressionAttributeValues: {
        ":a": {
            S: "John Doe"
        }
    },
    FilterExpression: "Author = :a",
    ProjectionExpression: "#U",
    TableName: "Conversations"
};
dynamodb.scan(params, function (err, data) {
    if (err) console.log(err, err.stack);
    else console.log(data);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...