2014-11-04 43 views
3

我在此之后文档非规范化的数据在MongoDB中学说的Symfony 2

http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/tutorials/getting-started.html

而且

http://symfony.com/doc/current/bundles/DoctrineMongoDBBundle/index.html

当我保存我的文档,我有两个Collection

这样的:

{ 
    "_id" : ObjectId("5458e370d16fb63f250041a7"), 
    "name" : "A Foo Bar", 
    "price" : 19.99, 
    "posts" : [ 
     { 
      "$ref" : "Embedd", 
      "$id" : ObjectId("5458e370d16fb63f250041a8"), 
      "$db" : "test_database" 
     } 
    ] 
} 

我想有

{ 
    "_id" : ObjectId("5458e370d16fb63f250041a7"), 
    "name" : "A Foo Bar", 
    "price" : 19.99, 
    "posts" : [ 
     { 
      "mycomment" :"dsdsds" 
      " date" : date 
     } 
    ] 
} 

我想我的非规范化的数据。我该怎么做?

我可以像使用$推的方法,$ addToSet的MongoDB等?

感谢

回答

6

主义ODM支持referencesembedded documents

在你的第一个例子中,你使用的引用。主文档(让我们假设它被称为产品)引用许多Post文档。那些Post文件存在于他们自己的集合中(出于某种原因,这个文件名为Embedd - 如果你保留这个模式,我会建议重命名)。默认情况下,ODM使用DBRef约定的引用,因此每个引用是本身$ref$id,并且$db领域一个小型的嵌入式文件。

非规范化可以通过使用嵌入的文档(在你的情况下的@EmbedMany映射)来实现。如果您正在嵌入Post文档,则应将Post类映射为@EmbeddedDocument。这告诉ODM,它不是(属于其自己的集合)一流的文件,所以不会担心被_id等的跟踪它(事实上,嵌入式文件甚至不需要标识,除非你想来映射一个)。

我来决定嵌入或引用的经验法则通常被问自己,“我需要的父文档的上下文之外这个文件?”如果某个帖子没有产品记录之外的身份,我很乐意将其嵌入;然而,如果我后来发现我的应用程序还想向用户显示其所有帖子的列表,或者需要通过帖子查询(例如,所有最近帖子的提要,而不考虑产品),那么我可能想参考文章在Posts集合中(或根据需要简单地复制嵌入式帖子)。

或者,您可以决定帖子应该存在于自己的收藏集中嵌入在产品中。在这种情况下,您可以创建一个AbstractPost类作为@MappedSuperclass并在其中定义常用字段。然后,用Post和EmbeddedPost子类扩展它(相应地映射)。您将负责创建一些代码以从Post文档生成EmbeddedPost,该代码适用于嵌入Product.posts阵列。此外,您需要处理顶级帖子和嵌入帖子之间的数据同步(例如,如果有人编辑帖子评论,您可能还希望更新所有相应的嵌入版本)。


在引用的主题:ODM还支持simple选项参考映射,在这种情况下,将只存储引用文档的_id,而不是更大的DBREF对象。在大多数情况下,对于每个引用的文档,使DBRef存储集合和数据库名称是相当多余的;但是,如果您使用的是single-collection inheritance,DBRef实际上很有用,因为ODM使用该对象来存储额外的鉴别器信息(即被引用对象的类)。

+0

好评!我可以在同一个项目中使用MySQL和mongodb吗? – Barno 2014-11-13 08:07:50

+1

绝对。 Steve Francia关于[将MongoDB与RDBMS融合用于电子商务]的演讲(http://www.mongodb.com/presentations/blending-mongodb-rdbms-e-commerce)描述了我们如何在OpenSky中做到这一点。具体到Doctrine ODM,有两篇关于[映射到ODM和ORM]的文档文章(http://doctrine-mongodb-odm.readthedocs.org/en/latest/cookbook/blending-orm-and-mongodb-odm。 html)和[混合ODM和ORM](http://doctrine-mongodb-odm.readthedocs.org/en/latest/cookbook/blending-orm-and-mongodb-odm.html),这可能有助于进一步阅读。 – jmikola 2014-11-13 17:11:34