【问题标题】:No-SQL database combine/count dataNosql 数据库合并/计数数据
【发布时间】:2017-07-01 19:05:30
【问题描述】:

我正在使用非 SQL 数据库(带有 mongoose ORM 的 mongoDB)开发我的第一个项目,并且在设计数据结构时遇到了一些麻烦。假设我正在开发一个应用程序,用于跟踪我办公室的桌上足球游戏桌的游戏结果和玩家统计数据。游戏由 A 或 B 方各 4 名玩家组成,可以采取进攻或防守位置。所以我有这个存储数据的结构

游戏合集:

Schema({
    id: String,
    side_a: {
        offense: {type: Schema.Types.ObjectId, ref: 'Player'},
        defence: {type: Schema.Types.ObjectId, ref: 'Player'},
        score: Number
    },
    side_b: {
        offense: {type: Schema.Types.ObjectId, ref: 'Player'},
        defence: {type: Schema.Types.ObjectId, ref: 'Player'},
        score: Number
    }
    winner: String, // side_a || side_b
    date: {type: Date, default: Date.now}
})

玩家收藏:

Schema({
    id: String,
    firstName: String,
    lastName: String
})

所以我的问题是什么是正确的方法(或者是否有可能)来组合来自这些集合的数据,所以我将具有以下 JSON 结构:

{
    "player_id": "123"
    "firstName": "Test",
    "lastName": "Test",
    "games_played": 280,
    "side_a": {
        "total_win": 100,
        "defence_win": 80,
        "offense_win": 20
    },
    "side_b": {
        "total_win": 84,
        "defence_win": 64,
        "offense_win": 20
    }
}

【问题讨论】:

  • 看起来您正在将数据建模为关系数据。这个article 让我了解了如何使用非关系模型对数据进行建模。

标签: mongodb mongoose nosql


【解决方案1】:

这取决于。您可以通过多种方式处理它:

1) 聚合

此方法涉及您必须以编程方式包含字段“firstName”和“lastName”,因为 mongodb 不允许连接集合。

2) 在玩家收藏中嵌入统计数据

玩家数据结构:

Schema({
    id: String,
    firstName: String,
    lastName: String,
    games_played: Number,
    side_a: {
        total_win: Number,
        defence_win: Number,
        offense_win: Number
    },
    side_b: {
        total_win: Number,
        defence_win: Number,
        offense_win: Number
    }
})

缺点:使用这种方法,您必须在玩家每次玩游戏时更新您的玩家收藏。

结论

如果您希望快速查询统计信息,请使用第二种方法,但请记住,这种方法需要手动维护计算字段。

另一方面,如果你使用合适的索引,你可以获得良好的性能。这种情况下的问题是您必须以编程方式包含“firstName”和“lastName”字段。

【讨论】:

    猜你喜欢
    • 2012-12-08
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2013-11-29
    • 2021-10-08
    相关资源
    最近更新 更多