mongodb - MongoDb Doctrine Symfony 2 中的非规范化数据

标签 mongodb symfony doctrine-orm doctrine

我正在关注这个文档

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

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

当我保存文档时,我有两个集合

像这样:

   {
    "_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
        }
    ]
}

我想对我的数据进行反规范化。我该怎么做?

我可以使用 mongoDb 的 $push、$addToSet 等方法吗?

谢谢

最佳答案

Doctrine ODM 同时支持 referencesembedded documents .

在您的第一个示例中,您使用的是引用。主文档(假设它称为 Product)引用了许多 Post 文档。这些 Post 文档存在于它们自己的集合中(出于某种原因,它被命名为 Embedd —— 如果您保留此架构,我建议重命名它)。默认情况下,ODM 使用 DBRef引用约定,因此每个引用本身就是一个包含 $ref$id$db 字段的小型嵌入式文档。

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

我决定嵌入或引用的经验法则通常是问自己,“我是否需要在父文档的上下文之外使用此文档?”如果帖子在产品记录之外没有身份,我很乐意将其嵌入;但是,如果我稍后发现我的应用程序还想向用户显示他们所有帖子的列表,或者我需要按帖子查询(例如,所有最近帖子的提要,与产品无关),那么我可能想引用Posts 集合中的文档(或根据需要简单地复制嵌入的 Posts)。

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


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

关于mongodb - MongoDb Doctrine Symfony 2 中的非规范化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26737849/

相关文章:

node.js - mongoose - 尝试保存文档数组,仅保存空数组

c++ - 用于 windows.string 的 mongodb c++ 驱动程序 3.2/3.x 已损坏

javascript - 如何添加 javascript 文件(不是 twig 文件)的路径?

php - Symfony2 : $form->isValid() always returning true

symfony - 如何通过 Twig 模板在 Silex 2 中使用 CSRF token ?

java - 使用 MongoDB Java 驱动程序更新嵌入式文档中的字段?

mongodb - 将mongodb/mongodump中集合的指定字段导出到文件

php - Doctrine2 迁移向下迁移并从浏览器而不是命令行迁移

php - Symfony2 和 Doctrine : how to fetch two different object for the same id?

mysql - Doctrine2 Symfony2 自定义函数解析器