0

我正在 MongoDB 中制作一个新应用程序,我发现面向文档的建模风格非常适合我的所有模型。

但是,我的一个绊脚石是“签入”式操作。用户可以在某个位置签到,我需要为每次签到存储以下内容:

  • 用户身份
  • 地点编号
  • 入住日期

现在通常我只是将它作为嵌入存储在用户文档下,但我经常想问以下问题:

  • 用户签到的所有地方都在哪里?
  • 在某个地方发生的所有签到是什么?
  • 给定用户位置组合的所有签到?
  • 用户的所有签到或特定时间范围内的地点?

在关系数据库中,这令人尖叫has-many through,但在 Mongo 中,这并不是那么明显的关系。我是否应该让 Checkin 成为顶级对象并接受连接式查询的性能影响?随着时间的推移,我可能还需要向签入对象添加字段,因此我希望保持解决方案的灵活性。

4

1 回答 1

2

是的。如果您将签到作为数组嵌入到用户文档中,那么查询“10 最近签到一个地方”几乎是不可能的。同样,如果您嵌入到位,“用户最近签到 10 次”将非常困难。所以让 checkins 成为它自己的集合。

如果您在 checkins 集合中同时索引 userid 和 placeid,您的查询应该足够快。例如,要查找用户 Jesse 最近的签到,请按名称查找用户以查找 Jesse 的 _id,然后查询该用户 ID 的签到。这只是两个查询。对于一个地方的最近签到也是如此。

如果您查询某个地点的最近签到并想要用户名,您可以首先查询签到集合以获取用户 ID 列表,然后使用 $in 查询获取所有用户文档。同样,这只是两个查询,如果您创建正确的索引,两个查询都会被完全索引。

于 2012-06-27T22:04:00.733 回答