Node.js DynamoDB查询相当于;作者在哪里?“…”;?

Node.js DynamoDB查询相当于;作者在哪里?“…”;?,node.js,amazon-dynamodb,Node.js,Amazon Dynamodb,给定以下数据结构 { "author": "USERNAME", "caption": "Caption of video", "createdAt": 1531260177951, "id": "03290200-848d-12e8-a1b5-bb9570f524f1", // Current primary key "s3Bucket": "s3-bucket-name", "s3Key": "USERNAME/1521260163051.mp

给定以下数据结构

{
    "author": "USERNAME",
    "caption": "Caption of video",
    "createdAt": 1531260177951,
    "id": "03290200-848d-12e8-a1b5-bb9570f524f1", // Current primary key
    "s3Bucket": "s3-bucket-name",
    "s3Key": "USERNAME/1521260163051.mp4",
    "updatedAt": 1531260177951
}
我正在尝试编写一个查询,它在其他语言中非常简单,比如SQL或MongoDB

Mongo:
db.getCollection(“视频”).find({author:{$in:[“USER1”,“USER2”,“…]}})。sort({createdAt:1})

SQL:
SELECT*从视频中,作者在('USER1',USER2',…)中按createdAt排序

如果在author字段中添加索引,这些查询通常运行得非常快

我已经在dynamoDb中对author字段进行了索引,但是除了对字段进行相同的检查之外,似乎没有其他方法<代码>作者=:输入作者
。试图在(:author1,:author2)中执行
编写操作会导致错误
在KeyConditionExpression:IN
中使用的运算符无效

DynamoDB对我来说是错误的数据库吗?或者我可以利用一些智能索引/查询快速运行查询


也有类似的问题,像这样,但据我所知,它们似乎都依赖于
扫描,这对于大型集合来说是次优。

如果你看一下下面的内容,你可能会意识到,对于KeyConditionExpressions,只有以下操作符是有效的:
EQ|LE | LT | GE | GT |以| BETWEEN

因此,这里的交易-如果您希望继续使用dynamodb,并且希望在
中为关键条件表达式执行类似于
的操作,那么您必须向dynamodb发送各种请求,每次单独包含一个作者,然后在您的终端将它们组合在一起

大概是这样的:

// Considering that this docClient is the instance of aws-sdk configured for dynamodb

const TABLE = 'Videos';

const createParams = (author) => {
    return {
        TableName: TABLE,
        KeyConditionExpression: "author = :author",
        ExpressionAttributeValues: {
            ":author": author
        }
    };
}

const queryPromise = (params) => {
    return new Promise((resolve, reject) => {
        docClient.query(params, function (err, data) {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        });
    });
}

// The list of authors
const authors = ['Vauxhall', 'Piccadilly', 'Acton', 'Milton', 'Hempsworth'];
const promises = [];

authors.forEach((author) => {
    promises.push(queryPromise(createParams(author)));
});

Promise.all(promises).then(results => {
    // Do your stuff here
}).catch(error => {
    // Handle errors the way you would
});

这就是我害怕的。我认为dynamoDb可能不是我所做工作的最佳选择,但它似乎是无服务器/lamdb的事实标准,这有点奇怪,因为它的功能集相当有限。无论如何,非常感谢@我明白了。我与dynamodb合作了一年,我们被迫单独使用dynamodb创建一个大型、复杂的用户应用程序。我要说的是,DynamoDb仍处于成熟过程中,因此,是的,目前无法绕过其有限的功能集。