Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 何时使用嵌入式文档?_Mongodb_Mongomapper - Fatal编程技术网

Mongodb 何时使用嵌入式文档?

Mongodb 何时使用嵌入式文档?,mongodb,mongomapper,Mongodb,Mongomapper,我正试图找出如何为我正在工作的网站布局我的数据库。以下是我的模型: class User include MongoMapper::Document // keys here many :items many :likes end class Item include MongoMapper::Document key :name, String, :required => true many :likes end class Like incl

我正试图找出如何为我正在工作的网站布局我的数据库。以下是我的模型:

class User
  include MongoMapper::Document

  // keys here

  many :items
  many :likes
end

class Item
  include MongoMapper::Document

  key :name, String, :required => true

  many :likes
end

class Like
  include MongoMapper::EmbeddedDocument

  key :user_id, String, :required => true
end
我相信像这样的
应该被嵌入到某个地方,但我很难选择一个,因为我想从中获得功能

user = User.first
user.likes // should print out all the Items he liked

item = Item.first
item.likes // so I can count how many people like that item
尽管使用EmbeddedDocument时会出现问题,但您会丢失
查找
和其他有用的方法,并且无法将其嵌入两种模型中。因此,只有在
项中才有它,我需要运行它(但无法):

将抛出未定义的方法
find\u by\u user\u id
。因此,如果我要将其嵌入我的
用户
,我仍然无法做到这一点

likes = Like.all // will throw undefined `all`
所以我得出结论,也许这样做:

class Like
  include MongoMapper::Document

  key :user_id, String, :required => true
  key :item_id, String, :required => true

  belongs_to :user
  belongs_to :item
end
但这似乎是我仍然试图做的事情老MySQL的方式。有谁能告诉我最可能用MongoMapper编写代码的方法吗


提前谢谢

是否可以在MongoMapper中对此进行建模取决于是否有数据需要存储在
类似的
模型中。如您的示例所示,如果没有任何与
类似的
模型相关联的数据,那么有一种方法。MongoMapper的最新更新增加了对多对多关系的支持,尽管它仍处于早期阶段

您可以这样创建模型:

class User
  include MongoMapper::Document
  key :name, String, :required => true
  key :liked_item_ids, Array
  many :liked_items, :in => :liked_item_ids, :class_name => "Item"
end

class Item
  include MongoMapper::Document
  key :name, String, :required => true
  many :fans, :class_name => "User", :foreign_key => :liked_item_ids
end
然后你可以做:

>> u = User.new( :name => 'emily' )
>> i = Item.new( :name => 'chocolate' )
>> u.liked_items << i
>> u.save
>> u.liked_items
=> [#<Item name: "chocolate", _id: 4b44cc6c271a466269000001>]

>> i.fans
=> [#<User name: "emily", liked_item_ids: [4b44cc6c271a466269000001], _id: 4b44cc6c271a466269000002>]
另一方面,如果像
一样有信息需要存储在
中,例如用户喜欢该项目的日期,则当前无法对其进行建模。在这种情况下,理想的设置(不管MongoMapper现在支持什么)与您在问题中包含的内容类似。您需要所有三个模型,在
用户
模型中嵌入
Like
,并且
有许多:通过
关系来创建从
用户
项目
的链接。不幸的是,MongoMapper对此的支持可能还很遥远


如果您希望在MongoMapper中鼓励支持此类行为,您可以在上询问或在上打开问题。

您可能需要阅读mongodb.org上的文档“嵌入与引用:

这似乎是目前的临时解决方案,在我选择这个作为选择答案之前,我会让它再运行几天,看看是否有更多的回应!谢谢在进一步调查之后,我发现John在GitHub上发布了一个问题,以获得一个更合适的
many:in
关系的反面版本,所以这也很快就会出现。如果您需要像
一样将信息保存在
中,仍然没有帮助。MongoMapper问题不再在Github跟踪,而是使用Pivotal Tracker,这里是:实际上,PivotalTracker是一个敏捷的项目管理应用程序,不用于问题跟踪,所以我认为这对于MongoMapper开发者来说是一个糟糕的选择。
>> u = User.new( :name => 'emily' )
>> i = Item.new( :name => 'chocolate' )
>> u.liked_items << i
>> u.save
>> u.liked_items
=> [#<Item name: "chocolate", _id: 4b44cc6c271a466269000001>]

>> i.fans
=> [#<User name: "emily", liked_item_ids: [4b44cc6c271a466269000001], _id: 4b44cc6c271a466269000002>]
many :fans, :class_name => "User", :source => :liked_items