代码之家  ›  专栏  ›  技术社区  ›  Automatico

dynamodb查询相当于“作者在哪里…”?

  •  1
  • Automatico  · 技术社区  · 6 年前

    给出以下数据结构;

    {
        "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("Videos").find({author: {$in: ["USER1", "USER2",..]}}).sort({createdAt: 1})

    SQL: SELECT * from videos WHERE author IN ('USER1', USER2',...) SORT BY createdAt

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

    我在dynamodb中对author字段做了索引,但是除了对该字段进行相等的检查之外,似乎没有其他方法可以做任何事情。 author = :inputAuthor . 尝试做一个 author IN (:author1, :author2) 导致错误 Invalid operator used in KeyConditionExpression: IN .

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

    有类似的问题,像这样; How to use “IN” statement in FilterExpression using array - dynamodb 但他们似乎都依赖 scan 据我所知,对于一个大的收藏来说,哪一个是次优的。

    1 回复  |  直到 6 年前
        1
  •  3
  •   nerdier.js    6 年前

    如果你能看一下下面 documentation ,您可能会认识到,对于keyconditionexpressions,只有以下运算符有效: EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN

    所以,这里是交易-如果你想继续使用dynamodb,并且想做一些像 IN 对于关键条件表达式,您必须向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
    });