簡體   English   中英

DynamoDB:查詢以查找字符串數組中的項

[英]DynamoDB: Query to find an item in an array of strings

可能我不太了解哈希/主鍵在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是一個數組,其中列出了對話參與者的userIds。

我需要創建一個服務來查找用戶參與的所有對話。在MongoDB(我更加熟悉)中,我將執行以下操作:

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

我可以在DynamoDB中做一些等效的事情嗎? 這是一個經常發生的API調用,因此我希望使其盡可能高效。

該答案考慮了對Hunter Frazier答案的評論,即您不想使用掃描。

使用查詢時,您需要在操作中指定一個分區鍵。 在您的架構中,這將意味着在userid屬性(這是一個集合)上進行分區。 DynamoDB中的分區鍵必須是頂級標量屬性。 由於userid不是標量(它是一個集合),因此不能將此屬性用作索引,因此無法對用戶所屬的對話進行查詢。

如果您需要執行此查詢,建議您重新訪問架構。 具體來說,我建議實現鄰接列表模式 ,該模式在包含多對多關系的數據庫中效果很好。

您可以在上面我在此答案上寫過的文章上看到一些其他注釋, DynamoDB MM鄰接列表設計模式

您的情況是:

  • 主鍵:ConversationID
  • 排序鍵:UserID
  • GSI主鍵:UserID

然后,您可以在查詢中使用GSI主鍵來返回用戶所屬的所有對話。

我不熟悉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);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM