DynamoDB — сканирование и фильтрация карты с помощью nodejs

Я использую nodejs для сканирования и фильтрации коллекции в DynaModb, которая выглядит так:

{
    "name": "teste123",
    "id": "4bbe0f00-67c3-11e7-a6be-b9c9fc540ac2",
    "clustermembers": [
        {
            "email": "[email protected]",
            "role": "ADMIN",
            "id": "4bbe0f00-67c3-11e7-a6be-b9c9fc540ac2"
        }
    ]
}

Со следующим куском кода:

var params = {
    TableName : "mytable",
    FilterExpression : "clustermembers.email = :p_email",
    ExpressionAttributeValues : {
        ":p_email": {"S": req.params.usr_email}  
    } 
};

var promiseQuery = client.scan(params).promise();

promiseQuery
    .then(function(data) {
        res.send({clusters: data.Items});
    })
    .catch(function(err) {
        console.log('ERROR -  get all clusters by user = ' + err);
        res.status(500).send('ERROR -  get all clusters by user = ' + err);
    }); 

Он должен вернуть одну запись, но я не получаю результатов. Что мне здесь не хватает?

Спасибо за помощь!


person Marrone    schedule 13.07.2017    source источник


Ответы (1)


Индекс массива должен быть включен, чтобы получить значение из типа данных List. В противном случае вам может понадобиться использовать функцию CONTAINS. Однако функция CONTAINS требует, чтобы все атрибуты объекта соответствовали элементу. В вашем сценарии вам нужно знать адрес электронной почты, идентификатор и роль, чтобы использовать функцию CONTAINS.

Примечание:-

Приведенное ниже решение не будет работать, если у вас есть несколько членов кластера, и вы хотите сопоставить элементы, присутствующие в других вхождениях в массиве. Для этого вам нужно использовать функцию CONTAINS, указав все три атрибута в объекте.

var params = {
    TableName: "mytable",
    FilterExpression: "clustermembers[0].email = :emailVal",
    ExpressionAttributeValues: {
        ":emailVal": '[email protected]'
    }
};
person notionquest    schedule 13.07.2017
comment
Привет, идео квест. Прежде всего, спасибо за помощь. Этот подход работает, но у меня нет всей информации об этом сценарии. Я проверяю, есть ли у вошедшего в систему пользователя доступ к этому кластеру, и у меня будет несколько членов кластера. Я думаю, что лучше перенести эти данные в другой, так как нет возможности искать конкретный адрес электронной почты в подколлекции, верно? Еще раз, спасибо за помощь. - person Marrone; 13.07.2017