我正在使用MongoDB作为我的数据库。我目前正在处理的查询显示我的架构可能存在缺陷。以下是我的收藏品的相关布局。 请注意,game.players是一个由2名玩家组成的阵列,因为该游戏是国际象棋。
users {_id, username, ...}
games {_id, players[], ...}
msgs {_id, username, gameid, time, msg}
我需要的数据是:
All msgs for games which a user is in which is newer than a given timestamp.
在SQL数据库中,我的查询类似于:
SELECT * FROM msgs WHERE time>=$time AND gameid IN
(SELECT _id FROM games WHERE players=$username);
但是,Mongo不是关系数据库,所以不支持子查询或连接。我看到两种可能的解决方案在性能方面和效率方面哪些更好?
答案 0 :(得分:2)
我是MongoDB的相对新手,但我发现自己经常使用这两种方法的组合。有些事情 - 例如用户名 - 经常被复制以简化用于显示的查询,但是每当我需要做的不仅仅是显示信息时,我最终会使用$ in编写多个查询,有时是2或3级,以收集我需要的所有文档为特定的操作而工作。
答案 1 :(得分:0)
你可以自己“规范化”。我会向列出他所属游戏的用户添加一个数组;
用户{_id,用户名,游戏= {game1,game2,game3}}
现在你可以在msgs上查询时间>时间$和{games._id“在”users.games}
您必须维护每个用户的游戏列表。