在MongoDB中处理数据。总计还是MR?

时间:2013-11-20 06:52:23

标签: mongodb mapreduce aggregation-framework

我有一个包含此类数据的集合

{"uid":"uirerb68624gdbnxcc", "location": "AA", "hit": "foodcat", "aggdone": "n"} 
{"uid": "hdbhdhu7347fhdufh", "location": "BB", "hit": "travelcat", "aggdone": "n"}
{"uid": "uirerb68624gdbnxcc", "location": "CC", "hit": "travelcat", "aggdone": "n"}

因此,您可以看到有一个用户比其他用户拥有更多“点击”。您建议我如何处理上面的这些数据并将它们推送到不同的集合中(我可以每周自由一次。我不需要实时),如下所示。

{"uid" : "uirerb68624gdbnxcc", "total_hits": 2}
{"uid" : "hdbhdhu7347fhdufh", "total_hits": 1}

另外,有一点非常重要,如果您看到第一个集合,则会有一个名为“aggdone”的密钥。它应该作为一个标志,并应标记为“y”处理所有数据。因此,下周我开始做同样的过程时,我不会处理所有数据。

请帮帮我。此外,欢迎任何有关数据设计的建议/意见。

提前致谢。

Mongo版本2.4.8

回应评论------

我有一个包含如下文档的集合。

{
  "gpcId": "CGP_52400c5e301d5",
  "storageCreateTime": "1380270840",
  "autoUid": "1ea548e1-8970-4833-bc27-16871b0cba4a",
  "reportingTime": "1380271111",
  "userIP": "117.200.181.36"
}

因此,对于具有不同报告时间的特定gpcId,autoUid可以重复多次。这意味着我们可以(逻辑上)获得最高用户列表(基于autoUid)。这正是我想要的并存储在不同的集合中。因此,理想情况下,生成的集合应该看起来像

{ 
  "gpcId": "CGP_52400c5e301d5",
  "autoUid": "1ea548e1-8970-4833-bc27-16871b0cba4a"
  "total_count": 10
}
{ 
  "gpcId": "CGP_52400c5e301d5",
  "autoUid": "06a02b72-8470-4492-af5f-96ea0d1e8235"
  "total_count": 9
}
.
.
.

所以,我想得到一些关于如何实现这一目标的指示。我已经提到了我的Mongo版本。我可以在后端使用PHP或Python来做这件事。

如果我第一次不太清楚,我很抱歉。

请告诉我是否仍然不清楚。

另外,我一直在尝试使用map-reduce,但我认为代码在这里没有意义,因为我无法达到任何甚至接近我想要的结果。

1 个答案:

答案 0 :(得分:0)

我认为我发现了它。这个问题对我有帮助。如果您认为可以做得更好,请告诉我。

db.mydb.aggregate({$ match:{gpcId:“CGP_52400c5e301d5”}},{$ group:{_ id:“$ autoUid”,total_count:{$ sum:1}}},{$ sort:{ total_count:-1}})