首页 > 解决方案 > 初学者试图了解聚合是如何工作的

问题描述

在我们的 SQL 初学者课程中,最后一件事是向其他几个 DB:s 倾斜我们的脚趾,我选择了 MongoDB。作为奖励回合,我能做的最后也是“最难”的事情是将此 sqlite 命令转换为 MongoDB 集合行。

sqlite> SELECT ore, COUNT(*), MAX(price) FROM Database GROUP BY ore;

我用这些值创建了数据库:

db.Database.insertMany( [
      { biome: "Desert", ore: "Silver", price: 8000 },
      { biome: "Forest", ore: "Gold", price: 5000 },
      { biome: "Meadow" , ore: "Silver", price: 7000 },
      { biome: "Swamp", ore: "Bronze", price: 6000 },
      { biome: "Mountains", ore: "Gold", price: 9000 },
      { biome: "Arctic" , ore: "Gold", price: 6500 }
      ] )

所以,是的......我一直在阅读有关管道和聚合操作的信息,但它在我的脑海中飘过 xP。这对本课程来说并不重要,但我很想了解这是如何进行的。我的学校有一个非常糟糕的习惯,就是用我们的母语教授所有东西,即使没有一个头脑正常的人会在现实生活中使用那个术语。这使我在尝试自学时有时很难学习这些东西。如果有人想举任何例子,我将不胜感激!

最终结果应如下所示:

sqlite> SELECT ore, COUNT(*), MAX(price) FROM Database GROUP BY ore;
ore         COUNT(*)    MAX(price)
----------  ----------  -----------
Silver      2           8000      
Bronze      1           6000       
Gold        3           9000   

标签: mongodb-query

解决方案


你要找的是$group舞台。

$group阶段用于根据一个或多个键对集合中的多个文档进行分组。您可以在此处了解有关此管道阶段的更多信息

您将在 Group 阶段的键中提及要分组的_id键。其余所有键都是用户定义的,可以使用 MongoDB 的内置运算符累积。在您的情况下,您可以使用$sum运算符并传入值1以将一个值添加到每个分组文档的用户定义count键中。要找到最高价格,请使用$max键并传入 $price(注意$前缀,因为您在源文档中自引用键)以获得单个组的最大值。

db.collection.aggregate([
  {
    "$group": {
      "_id": "$ore",
      "count": {
        "$sum": 1
      },
      "max": {
        "$max": "$price"
      }
    },
  },
])

Mongo Playground 示例执行


推荐阅读