何时在Mongo DB中嵌入文档

And*_*ird 6 mongodb

我正在试图弄清楚如何最好地设计Mongo DB模式.Mongo DB文档建议严重依赖嵌入式文档来改进查询,但我想知道我的用例是否真的证明了引用文档的合理性.

我当前架构的一个非常基本的版本基本上是:(对于伪格式的道歉,我不知道如何表达Mongo架构)

users {
  email (string)
}

games {
  user (reference user document)
  date_started (timestamp)
  date_finished (timestamp)
  mode (string)
  score: {
    total_points (integer)
    time_elapsed (integer)
  }
}
Run Code Online (Sandbox Code Playgroud)

游戏很短(大约60秒),我期待很多并发写入.

在某些时候,我将要计算一个高分列表,并且可能以隔离的方式(例如,特定游戏的高分列表.模式或日期)

嵌入式文档是最好的方法吗?或者这真是一个关系解决得更好的问题吗?如何在Mongo DB中最好地解决这些用例?

Gat*_* VP 8

......这真是一个关系解决得更好的问题吗?

这里的关键不是"这是一种关系吗?" 还有更多关于"我将如何访问它?"

MongoDB不是"反引用".MongoDB的确实具备加入的好处,但它确实有嵌入文档的好处.

只要您理解这些权衡,那么在MongoDB中使用引用是完全公平的.这真的是关于你打算如何查询这些对象.

嵌入式文档是最好的方法吗?

也许.有些事情需要考虑.

  • 不要games有没有这方面的价值之外user
  • 多少games单将user有?
  • games交易性质的吗?
  • 你打算怎么去games?你总是需要所有用户的游戏吗?

如果您计划构建排行榜并且用户可以生成数百个游戏文档,那么将游戏放在他们自己的集合中可能是公平的.在每个用户内部存储一万个"游戏"实例并不是特别有用.

但是根据你对上述的回答,你可以选择其中任何一种方式.作为试金石,我会尝试一些运行的Map/Reduce作业(即构建一个简单的排行榜),就看你如何看待你的数据结构.