0

我对 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 的用户的推文进行分析。上面的模型布局在概念上是有意义的,但是在什么时候这太笨拙了?什么是可行的替代方案?

4

2 回答 2

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',
    ...
}
于 2012-02-17T11:24:53.637 回答
1

所有功劳归功于 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]
}
于 2012-02-23T17:39:01.020 回答