10

集計フレームワークを使用して、配列の特定の要素でグループ化することはできますか?

このようなドキュメントでは、次のようになります。

{
  name: 'Russell',
  favourite_foods: [
    { name: 'Pizza', type: 'Four Cheeses' },
    { name: 'Burger', type: 'Veggie'}
  ],
  height: 6
}

一番好きな食べ物 (つまり、インデックス 0 の食べ物) の個別のリストと、一番好きな食べ物である最も背の高い人の身長を取得できますか?

このようなもの (ただし、配列インデックス アクセスのドット表記が集計フレームワークで機能しないように見えるため、機能しません):

db.people.aggregate([
  { $group : { _id: "$favourite_foods.0.name", max_height: { $max : "$height" } } }
])
4

4 に答える 4

17

配列の最初にいる各人の好きな食べ物に頼っているようです。もしそうなら、利用できる集計フレームワーク演算子があります。

使用できるパイプラインは次のとおりです。

db.people.aggregate(
[
    {
        "$unwind" : "$favourite_foods"
    },
    {
        "$group" : {
            "_id" : {
                "name" : "$name",
                "height" : "$height"
            },
            "faveFood" : {
                "$first" : "$favourite_foods"
            }
        }
    },
    {
        "$group" : {
            "_id" : "$faveFood.name",
            "height" : {
                "$max" : "$_id.height"
            }
        }
    }
])

このサンプル データセットでは:

> db.people.find().pretty()
{
    "_id" : ObjectId("508894efd4197aa2b9490741"),
    "name" : "Russell",
    "favourite_foods" : [
        {
            "name" : "Pizza",
            "type" : "Four Cheeses"
        },
        {
            "name" : "Burger",
            "type" : "Veggie"
        }
    ],
    "height" : 6
}
{
    "_id" : ObjectId("5088950bd4197aa2b9490742"),
    "name" : "Lucy",
    "favourite_foods" : [
        {
            "name" : "Pasta",
            "type" : "Four Cheeses"
        },
        {
            "name" : "Burger",
            "type" : "Veggie"
        }
    ],
    "height" : 5.5
}
{
    "_id" : ObjectId("5088951dd4197aa2b9490743"),
    "name" : "Landy",
    "favourite_foods" : [
        {
            "name" : "Pizza",
            "type" : "Four Cheeses"
        },
        {
            "name" : "Pizza",
            "type" : "Veggie"
        }
    ],
    "height" : 5
}
{
    "_id" : ObjectId("50889541d4197aa2b9490744"),
    "name" : "Augie",
    "favourite_foods" : [
        {
            "name" : "Sushi",
            "type" : "Four Cheeses"
        },
        {
            "name" : "Pizza",
            "type" : "Veggie"
        }
    ],
    "height" : 6.2
}

次の結果が得られます。

{
    "result" : [
        {
            "_id" : "Pasta",
            "height" : 5.5
        },
        {
            "_id" : "Pizza",
            "height" : 6
        },
        {
            "_id" : "Sushi",
            "height" : 6.2
        }
    ],
    "ok" : 1
}
于 2012-10-25T01:41:38.593 に答える
5

現在、集計で配列から特定の要素を抽出することはできないようです: https://jira.mongodb.org/browse/SERVER-4589

于 2012-10-24T20:20:15.783 に答える
3

を使用した後、結果に関する詳細情報を追加するだけ"$wind"です:


資料 :

> db.people.find().pretty()
{
    "_id" : ObjectId("508894efd4197aa2b9490741"),
    "name" : "Russell",
    "favourite_foods" : [
        {
            "name" : "Pizza",
            "type" : "Four Cheeses"
        },
        {
            "name" : "Burger",
            "type" : "Veggie"
        }
    ],
    "height" : 6
},
...


集計 :

db.people.aggregate([{
    $unwind: "$favourite_foods"
}]);


結果 :

{
    "_id" : ObjectId("508894efd4197aa2b9490741"),
    "name" : "Russell",
    "favourite_foods" :{
            "name" : "Pizza",
            "type" : "Four Cheeses"
    },
    "height" : 6
},
{
    "_id" : ObjectId("508894efd4197aa2b9490741"),
    "name" : "Russell",
    "favourite_foods" : {
            "name" : "Burger",
            "type" : "Veggie"
    },
    "height" : 6
}


さらに
、1 つのコレクション レコードに 3 つ以上の配列フィールドがある場合は、"$project"ステージを使用して配列フィールドを指定できます。

db.people.aggregate([
    {
        $project:{
            "favourite_foods": 1
        }
    },
    {
        $unwind: "$favourite_foods"
    }
]);
于 2016-05-06T07:22:08.303 に答える
2

$project および $unwind 演算子を利用できると思います (これが目的でない場合はお知らせください)。

> db.people.aggregate(
   {$unwind: "$favourite_foods"}, 
   {$project: {food : "$favourite_foods", height: 1}}, 
   {$group : { _id: "$food", max_height: { $max : "$height" } } })


{
    "result" : [
        {
            "_id" : {
                "name" : "Burger",
                "type" : "Veggie"
            },
            "max_height" : 6
        },
        {
            "_id" : {
                "name" : "Pizza",
                "type" : "Four Cheeses"
            },
            "max_height" : 6
        }
    ],
    "ok" : 1
}

http://docs.mongodb.org/manual/applications/aggregation/

于 2012-10-24T23:22:37.990 に答える