【问题标题】:MongoDB data structure with large number internal documents具有大量内部文档的MongoDB数据结构
【发布时间】:2012-02-24 01:39:01
【问题描述】:

我对 MongoDB 比较陌生,到目前为止印象非常深刻。不过,我正在努力寻找设置文档存储的最佳方法。我正在尝试使用推特数据进行一些摘要分析,但我不确定是将推文放入用户文档中,还是将它们保存为单独的集合。似乎将推文放在用户模型中会很快达到大小的限制。如果是这种情况,那么在一组用户的推文中运行 MapReduce 的好方法是什么?

我希望我不是太含糊,但我不想在设置我的领域模型方面过于具体和走得太远。

我相信你们都听腻了,我已经习惯了 RDB 领域,我会像这样布置我的架构

| USER |
--------
|ID
|Name
|Etc.

|TWEET__|
---------
|ID
|UserID
|Etc

Mongo 中的逻辑模式似乎是

User
|-Tweet (0..3000)
  |-Entities
    |-Hashtags (0..10+)
    |-urls (0..5)
    |-user_mentions (0..12)
  |-GeoData (0..20)
|-somegroupID

但不会很快使用户文档膨胀到超出容量。但我想对属于具有相似 somegroupID 的用户的推文进行分析。上面的模型布局在概念上是有意义的,但是在什么时候这太笨拙了?还有哪些可行的替代方案?

【问题讨论】:

    标签: mongodb schema-design


    【解决方案1】:

    您是对的,您可能会在此处遇到 16MB 的 MongoDB 文档限制。您并没有说要运行哪种分析,因此很难推荐模式。 MongoDB 模式的设计考虑了数据查询(和插入)模式。

    除了将推文放在用户中之外,您当然可以很容易地做相反的事情,将用户 ID 和组 ID 添加到推文文档本身中。然后,如果您需要来自用户的其他字段,您可以随时在显示时将其拉入第二个查询中。

    我的意思是推文文档的设计如下:

    { '标签':['#foo','#bar'], 'urls': [ "http://url1.example.com", 'http://url2.example.com' ], 'user_mentions':['queen_uk'], '地理数据': { ... }, 'userid': 'derickr', 'somegroupid':40 }

    然后对于用户集合,文档可能如下所示:

    { 'userid' : 'derickr', '实名' : Derick Rethans', ... }

    【讨论】:

    • 我确实提到了“我想对属于具有相似 somegroupID 的用户的推文进行分析”。将“somegroupID”元素添加到要在该组中跟踪的每条推文中不会破坏插入模式吗?如果我这样做,那么对该子集进行 mapReduce / 分析就很明显了。
    • 我不明白你所说的“插入模式”是什么意思,你也没有提到你想做什么样的分析。无论如何,如果可以的话,您可能希望避免 M/R,并使用普通查询进行分析。
    • 我的意思是更新数据的最佳实践。如果一个用户被添加到另一个用户的“somegroupID”,那么我必须在与该用户关联的所有推文文档中插入该 somegroupID。似乎插入的开销很高。然后关于使用普通查询进行分析,Mongo 是否在 GROUP BY 上执行 count() 之类的操作?要获得每天的推文数量或类似的东西?
    【解决方案2】:

    感谢 MongoHQ.com 的优秀人员。我的问题在https://groups.google.com/d/msg/mongodb-user/OtEOD5Kt4sI/qQg68aJH4VIJ得到了回答

    克里斯·温斯莱特 @ MongoHQ


    你会发现这个视频很有趣:

    http://www.10gen.com/presentations/mongosv-2011/schema-design-at-scale

    本质上,在一个文档中,将一天的推文存储为一个 人。推理:

    • 查询通常包含天数和用户数

    因此,可以有如下索引:

    {user_id: 1, date: 1} # 日期必须是最后一个,因为你会设置范围 并按日期排序

    玩得开心!

    克里斯·蒙戈总部


    我认为实现以下内容最有意义:

    用户

    { user_id: 123123,
      screen_name: 'cledwyn',
      misc_bits: {...},
      groups: [123123_group_tall_people, 123123_group_techies, ],
      groups_in: [123123_group_tall_people]
    }
    

    推特

    { tweet_id: 98798798798987987987987,
      user_id: 123123,
      tweet_date: 20120220,
      text: 'MongoDB is pretty sweet',
      misc_bits: {...},
      groups_in: [123123_group_tall_people]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2014-05-26
      相关资源
      最近更新 更多