【问题标题】:mongodb: group VS map-reduce VS aggregationmongodb:组 VS map-reduce VS 聚合
【发布时间】:2014-03-18 18:56:54
【问题描述】:

我正在尝试合并两个集合,但我不知道该怎么做。

我应该使用 Group、MapReduce、Aggregation 还是什么?

内容

content_id
----------
1
2
3

反应

content_id     user
----------     ----
1              john
2              john
1              steve
2              steve
2              paul

如何获取所有内容的列表以及对每个内容做出反应的用户数?像这样:

content_id       reactions
----------       ---------
1                2
2                3
3                0

【问题讨论】:

  • 如果您想以有效的方式合并两个集合,MongoDB 可能不是您的正确选择。它不做连接。
  • 谢谢,我知道,但是数据已经在 mongo 中了。现在我只需要一个临时任务
  • @user3175226 这太简短了。怎么临时?虽然我理解抽象的倾向。一般来说,抽象的问题会得到抽象的答案。如果你没有在你的问题中说出你真正想要的,那么不要责怪他们没有回应你想要的东西。有几种不同的方法。但你并没有说确切你在做什么。
  • 我只是想收集有关我在 mongodb 中的数据的统计信息。如前所述,合并两个集合。

标签: mongodb mapreduce aggregation-framework


【解决方案1】:

鉴于上述数据,最简单的形式是使用聚合。您不需要“合并”集合,因为您只需使用一个集合即可获得所需的输出:

db.reactions.aggregate([
    { "$group": {
        "_id": "$content_id",
        "reactions": { "$sum": 1 }
    }}
])

当然,这比尝试在代码中循环结果要快得多。

【讨论】:

    【解决方案2】:

    就像@Joachim 和@Neil 指出的那样,您的问题仍然很抽象,而且您的数据似乎没有正确建模。如果您有充分的理由以这种方式对其进行建模,那很好。

    但如果这是一项临时任务,您可以尝试以下操作:

    > db.contents.find().forEach(function(doc) { 
    ... var count = db.reactions.find({content_id:doc._id}).count(); 
    ... print(doc._id + " - " + count) 
    ... })
    1 - 2
    2 - 3
    3 - 0
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2011-07-14
      • 2019-03-24
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 2013-01-28
      相关资源
      最近更新 更多