2012-03-06 61 views
0

我正在学习如何使用mongo与红宝石使用mongoid宝石。我创建了一个简单的待办事项应用程序作为学习体验。我每星期一星期一到星期一,每个星期都有许多待办事项。我的文件将是这个样子:Mongoid:如何模拟一周内的嵌入式文档?

week = { 
    'year': 2012, 
    'week': 10, 
    'monday': [ 
     {'task': 'take out the trash', 'effort_points': 1}, 
     {'task': 'build a house', 'effort_points': 5} 
    ], 
    'tuesday': [], 
    'wednesday': [], 
    'thursday': [], 
    'friday': [] 
} 

到目前为止,我有一些类,看起来像这样(有些可能是伪代码):

class Week 
    include Mongoid::Document 
    field :year, type: Integer 
    field :week, type: Integer 
    embeds_one :day, as: :monday 
    embeds_one :day, as: :tuesday 
    embeds_one :day, as: :wednesday 
    embeds_one :day, as: :thursday 
    embeds_one :day, as: :friday 
end 

class Day 
    include Mongoid::Document 
    embedded_in :week 
    embeds_many :items 
end 

class Item 
    include Mongoid::Document 
    embedded_in :day 
    field :task 
    field :effort_points 
end 

如何适当这些对象进行建模使用mongoid?

回答

1

我不会在数据库中保留一天一周。我会有一个集合/类任务,并在其上放置一个日期字段。当您想要显示一周的任务是什么时,只需获取该周日期下降的所有任务。

+0

嗯...似乎这将违背使用Mongo的优势。由于这些“任务”的数据量非常小,因此将它们组合在一起(并将它们嵌入到更大的文档中)是有利的,因此获取和显示记录效率最高。我对Mongo的表现并不了解,但我认为提取单个文档比返回25个文档更有效率。你怎么看? – Andrew 2012-03-07 21:25:39

+0

如果您正在使用的字段上有一个索引来选择它们,它是1个数据库调用,速度非常快。与您所谈论的SQL数据库相比,您可以通过将相关内容保存在单个文档中来避免执行JOIN。例如,如果任务有很多“注释”,则可以将这些任务留在任务中,而不必加入“笔记”表以检索它们。 – nicholaides 2012-03-07 23:31:26

2

我想你是正确的,提取一个文件比提取15更有效,但你必须记住,根级文档是你将从数据库中获取的量子单位。因此,如果您在单个文档中保留一周的星期几,即使您需要单个任务,也必须从db获取一周。

另一种方式可以是模拟白天如下:

class Week 
    include Mongoid::Document 
    field :year, type: Integer 
    field :week, type: Integer 
    embeds_many :days 
end 

class Day 
    include Mongoid::Document 
    field :day, type: String 
    embedded_in :week 
    embeds_many :items 

    validates :day, :in => [:monday, tuesday, ....] 
end 

这将有额外的好处,当你想看看周有一定的任务,涉及到咖啡,你可以查询:

Week.where("days.items.task" => /coffeee/i).all 

# Instead of 
Week.all.or("monday.items.task" => /coffee/i).or("tuesday.items.task: => /coffee/i)... 

它主要是有道理的,因为周是根文件,但如果你需要独立的每一天的任务可能你会使天作为一个单独的集合。 PS:想让它成为评论,但太长了。