在Mongo中分组两列

时间:2016-09-08 20:10:36

标签: mongodb aggregation-framework

在mongo中说我有一个看起来像这样的集合:

+----+-----+-----+----------+
| id | x   | y   | quantity |
+----+-----+-----+----------+
| 1  | abc | jkl | 5        |
+----+-----+-----+----------+
| 2  | jkl | xyz | 10       |
+----+-----+-----+----------+
| 3  | xyz | abc | 20       |
+----+-----+-----+----------+

我想做一个$等于y的$ group并总结数量。所以输出看起来像:

+-----+-------+
| x   | total |
+-----+-------+
| abc | 25    |
+-----+-------+
| jkl | 15    |
+-----+-------+
| xyz | 30    |
+-----+-------+

这甚至可以在mongo中进行吗?

1 个答案:

答案 0 :(得分:2)

您不会执行$ group来检索结果。您正在执行$lookup。此功能是MongoDB 3.2中的新功能。

使用您提供的样本数据,聚合如下:

db.join.aggregate( [
 { 
   "$lookup" : {
     "from" : "join",
     "localField" : "x", 
     "foreignField" : "y", 
     "as" : "matching_field"
   } 
 },
 {
   "$unwind" : "$matching_field"
 },
 {
   "$project" : {
     "_id" : 0,
     "x" : 1, 
     "total" : { "$sum" : [ "$quantity", "$matching_field.quantity"]}
   }
 }
])

示例数据集非常简单,因此当为值返回多个简单结果时,您需要测试行为。

编辑:

如果X和Y之间可以有多个匹配,则会变得更复杂。

// Add document to return more than a single match for abc
db.join.insert( { "x" : "123", "y" : "abc", "quantity" : 100 })

// Had to add $group stage to consolidate matched results 
db.join.aggregate( [
  { 
    "$lookup" : {
      "from" : "join",
      "localField" : "x", 
      "foreignField" : "y", 
      "as" : "matching_field"
    } 
  },
  {
    "$unwind" : "$matching_field"
  },
  { "$group" : { 
    "_id" : { "x" : "$x", "quantity" : "$quantity" },
    "matched_quantities" : { "$sum" : "$matching_field.quantity" }
  }},
  {
    "$project" : {
      "x" : "$_id.x", 
      "total" : { "$sum" : [ "$_id.quantity", "$matched_quantities" ]}
    }
  }
])