从“外键”ObjectId高效查询用户名

时间:2012-12-22 18:49:56

标签: ruby-on-rails mongodb mongoid query-optimization relationship

例如,我有模型UserPost

用户

{
    "_id": ObjectId("pretendThisIsAUserObjectId"),
    "name": "someUser"
}

发表

{
    "_id": ObjectId("pretendThisIsAUserObjectId"),
    "title": "blah blah",
    "user_id": ObjectId("pretendThisIsAUserObjectId"),
    "content": "more blah"
}

用户有很多帖子。因此,我们user_id存储了Post

因此,当我们列出每个用户的帖子时,我们将有N + 1个查询(N个帖子加上1个用户姓名查询),因为我们没有加入MongoDB。

我们还可以在Post中存储用户名,以进行优化吗?

2 个答案:

答案 0 :(得分:2)

简短的回答是。您可以将数据归一化到您认为适合您特定需求的任何程度。您甚至可以在每个User中存储整个Post文档,但这将是愚蠢的重复数量。

然而,我的第一个倾向是考虑与每个用户ID关联的用户名的应用程序端缓存,而不是试图在Post文档中包含该名称或每次都查询它想要它。

如果您的用户名是唯一的,则可以考虑将用户名设为_id文档的User,而不是标准ObjectId。这使得您的用户ID更加有用,因为您不再需要执行其他查询来查找每个用户的名称,因为他们的名称是他们的ID。

答案 1 :(得分:0)

如果您启用了Identity Map,则可以像往常一样使用includes

Post.includes(:user)...

请参阅Eager Loading