1

有了这个给定的数据。

{ "_id" : 0, "a" : 0, "b" : 0, "c" : 21 }
{ "_id" : 1, "a" : 0, "b" : 0, "c" : 54 }
{ "_id" : 2, "a" : 0, "b" : 1, "c" : 52 }
{ "_id" : 3, "a" : 0, "b" : 1, "c" : 17 }
{ "_id" : 4, "a" : 1, "b" : 0, "c" : 22 }
{ "_id" : 5, "a" : 1, "b" : 0, "c" : 5 }
{ "_id" : 6, "a" : 1, "b" : 1, "c" : 87 }
{ "_id" : 7, "a" : 1, "b" : 1, "c" : 97 }

查询是这样的

db.fun.aggregate([{
    $group: {
        _id: { a: "$a", b: "$b" },
        c: { $max: "$c" }
    }
}, {
    $group: {
        _id: "$_id.a",
        c: { $min: "$c" }
    }
}])

正确答案是

54 and 22

怎么会这样?我期待成为97 and 21

为什么我认为 97 为最大值,21 为最小值?因为所有具有相似值的文档(即a和b)c最高,最低为21

有人可以向我详细说明吗?以及 $group 是如何工作的?

4

2 回答 2

1

首先为您提供按和$group分组并选择 的最大值的结果。因此,例如,它得到和组合:abca=0b=0

{ "_id" : 0, "a" : 0, "b" : 0, "c" : 21 }
{ "_id" : 1, "a" : 0, "b" : 0, "c" : 54 }

为此,它将对它们进行分组并选择21或的最大值54,即54。所以你得到所有组的这个结果:

    {
        "_id" : {
            "a" : 1,
            "b" : 1
        },
        "c" : 97
    },
    {
        "_id" : {
            "a" : 1,
            "b" : 0
        },
        "c" : 22
    },
    {
        "_id" : {
            "a" : 0,
            "b" : 1
        },
        "c" : 52
    },
    {
        "_id" : {
            "a" : 0,
            "b" : 0
        },
        "c" : 54
    }

这就是你的第二个$group将要使用的东西。此时它分组a并选择 min c。所以你可以看到 for a=1min of c(from 22and 97) 将是22并且 for a=0min c(from 52and 54) 将是52

所以这就是你得到22和的方式52

于 2013-09-15T11:29:08.403 回答
0

从关系 (SQL) 的角度来看,这个问题真的很容易,因为$group在您的场景中,它与 SQL 的GROUP BY.

因此,假设您的数据位于名为MongoDatacolumns和的表A中,这就是与您的聚合等效的 select 的样子:BC

select A, min(C) MinC
from (
    select A, max(C)
    from MongoData
    group by A, B
  ) X (A, C)
group by A;

运行聚合步骤 1(或内部 Select)后的结果是:

A   B   MaxC
------------
0   0   54
1   0   22
0   1   52
1   1   97

Step2 通过仅按以下方式分组来减少此数据A

A   MinC
--------
0   52
1   22

看看这个 SQLFiddle,看看这两个步骤后数据的样子:http ://sqlfiddle.com/#!3/7d4f5/10

于 2013-09-15T12:21:29.463 回答