0

我有两个模型。

class User
  include Mongoid::Document

  field :name, type: String

  embeds_many :posts
end

class Post
  include Mongoid::Document

  field :comment, type: String

  embedded_in :user
end

现在假设我得到了第一个用户的第一个帖子,然后我打电话给用户的名字。这会导致调用额外的查询还是父文档与帖子分开?

posts = User.first.posts

first_post = posts.first

# Will this line of code below initiate a query search for users?
users_name = first_post.user.name
4

1 回答 1

2

按照设计,MongoDB 一次只允许从一个集合中检索文档。因此,如果 aPost在与 分开的集合中Users,则需要两个查询。虽然可以缓存给定的文档(不需要进行第二次查询),但假设通常会进行两次查询。

PostMongoDB 的一些驱动程序尝试使用运算符为单个集合(例如 s)收集多个记录$in。此外,你可以使用 Mongoid 附加缓存功能进行一些预取/缓存:http: //mongoid.org/en/mongoid/docs/extras.html#caching

使用嵌入文档时,整个文档实际上是在上面显示的查询中获取的,因此不需要第二次查询来获取名称。

# the entire User object matching the statement is fetched (the first User)
posts = User.first.posts  
# nothing happens here ... just client side
first_post = posts.first

# No, this won't result in a second query, as the entire document was fetched
users_name = first_post.user.name
于 2013-07-18T18:58:04.130 回答