1

我将 Dynamodb 与 nodejs 一起用于我的预订系统。和Dynamoose作为 ORM。我有两张桌子,即TableReservation。为了在它们之间创建关系,我在Reservation中添加了tableId属性,该属性是 Model 类型(Table 类型),如 dyanmoose docs中所述。使用document.populate我可以通过来自Reservation表的tableId属性获取数据。但是我怎样才能检索一个表的所有预订?(Reservation 和 Table 有一对多的关系)?

这些是我的模型: 表模型:

    const tableSchema = new Schema ({
        tableId: {
            type: String,
            required: true,
            unique: true,
            hashKey: true
        },
        name: {
             type: String,
             default: null
        },
    });

*Reservation Model:*

    const reservationSchema = new Schema ({
        id: {
            type: Number,
            required: true,
            unique: true,
            hashKey: true
        },
        tableId: table,   \\as per doc attribute of Table (Model) type 
        date: {
            type: String
        }
    });

这就是我从预订模型中检索表数据的方式

reservationModel.scan().exec()
        .then(posts => {
            return posts.populate({
                path: 'tableId',
                model: 'Space'
              });
        })
        .then(populatedPosts => {
        
            console.log('pp',populatedPosts);
            return {
                allData: {
                  message: "Executedddd succesfully",
                  data: populatedPosts
                }
              }
        })

请任何人帮助从表中检索所有预订数据?

4

1 回答 1

1

从 v2.8.2 开始,Dynamoose 不支持此功能。Dynamoose 专注于单向简单关系。这部分是由于我们不鼓励使用model.populate. 需要注意的是,model.populate它向 DynamoDB 发出另一个完全独立的请求。这会增加延迟并降低应用程序的性能。

与 SQL 相比,DynamoDB 确实需要转变您对数据建模的看法。我建议观看AWS re:Invent 2019:使用 Amazon DynamoDB 进行数据建模 (CMY304),以很好地解释如何以高效的方式在 DynamoDB 中对数据进行建模。

在某些时候 Dynamoose 可能会增加对此的支持,但很难说我们是否会这样做。

如果您真的想这样做,我建议您tableId在预订模式中为您的属性添加一个全局索引。然后你可以运行类似下面的东西:

async function code(id) {
    const reservation = await reservationModel.get(id);
    const tables = await tableModel.query("tableId").eq(id).exec(); // This will be an array of `table` entries where `"tableId"=id`. Remember, it is required you add an index for this to work.
}

请记住,这将导致对 DynamoDB 的多次调用并且效率不高。我强烈建议观看上面链接的视频,以获取有关如何以更有效的方式对数据建模的更多信息。

最后,我想指出您的unique: true代码什么都不做。正如在Dynamoose 属性设置文档中看到的那样,unique这不是一个有效的设置。在您的情况下,由于您没有 a rangeKey,因此两个项目不可能具有相同的hashKey,因此从技术上讲,它已经是基于此的独特属性。但是重要的是要注意,您可以在创建项目时覆盖现有项目。您可以设置为overwrite或阻止该行为并引发错误而不是覆盖您的文档。falsedocument.saveModel.create

于 2021-11-25T16:42:16.637 回答