在MongoDB中聚合不同的值

时间:2018-03-18 17:18:27

标签: mongodb

我有一个拥有18625个收藏的mongodb数据库。它有以下键:

    "_id" : ObjectId("5aab14d2fc08b46adb79d99c"), 
    "game_id" : NumberInt(4), 
    "score_phrase" : "Great", 
    "title" : "NHL 13", 
    "url" : "/games/nhl-13/ps3-128181", 
    "platform" : "PlayStation 3", 
    "score" : 8.5, 
    "genre" : "Sports", 
    "editors_choice" : "N", 
    "release_year" : NumberInt(2012), 
    "release_month" : NumberInt(9), 
    "release_day" : NumberInt(11)

现在,我希望创建另一个只有流派的维度/集合。

如果我使用以下查询:

db.ign.aggregate([ {$project: {"genre":1}}, { $out: "dimen_genre" } ]);

它生成18625个集合,即使只有113个不同 流派。

如何在此处应用distinct并获取仅具有不同113值的类型的集合。 我用谷歌搜索,它表明聚合和不同在mongo中不能一起工作。 我也尝试过:db.dimen_genre.distinct('genre')。length 这表明在dimension_genre中,有113种不同的类型。

准确地说, 如何从仅具有不同值的现有集合中创建集合。

我是NoSQLs的新手。

2 个答案:

答案 0 :(得分:2)

您可以使用$addToSet对一个文档中的唯一值进行分组,然后使用$unwind来获取多个文档:

db.ign.aggregate([
    {
        $group: {
            _id: null,
            genre: { $addToSet: "$genre" }
        }
    },
    {
        $unwind: "$genre"
    },
    {
        $project: {
            _id: 0
        }
    },
    { $out: "dimen_genre" }
]);

答案 1 :(得分:1)

你可以尝试

db.names.aggregate(
   [
     { $group : { _id : "$genre", books: { $push: "$$ROOT" } } }
   ]
)

我尝试过将Test and Sports作为流派

它为您提供类似的输出

{
    "_id" : "Test",
    "books" : [ 
        {
            "_id" : ObjectId("5aaea6150cc1403ee9a02e0c"),
            "game_id" : 4,
            "score_phrase" : "Great",
            "title" : "NHL 13",
            "url" : "/games/nhl-13/ps3-128181",
            "platform" : "PlayStation 3",
            "score" : 8.5,
            "genre" : "Test",
            "editors_choice" : "N",
            "release_year" : 2012,
            "release_month" : 9,
            "release_day" : 11
        }
    ]
}

/* 2 */
{
    "_id" : "Sports",
    "books" : [ 
        {
            "_id" : ObjectId("5aaea3be0cc1403ee9a02d97"),
            "game_id" : 4,
            "score_phrase" : "Great",
            "title" : "NHL 13",
            "url" : "/games/nhl-13/ps3-128181",
            "platform" : "PlayStation 3",
            "score" : 8.5,
            "genre" : "Sports",
            "editors_choice" : "N",
            "release_year" : 2012,
            "release_month" : 9,
            "release_day" : 11
        }, 
        {
            "_id" : ObjectId("5aaea3c80cc1403ee9a02d9b"),
            "game_id" : 4,
            "score_phrase" : "Great",
            "title" : "NHL 13",
            "url" : "/games/nhl-13/ps3-128181",
            "platform" : "PlayStation 3",
            "score" : 8.5,
            "genre" : "Sports",
            "editors_choice" : "N",
            "release_year" : 2012,
            "release_month" : 9,
            "release_day" : 11
        }, 
        {
            "_id" : ObjectId("5aaea3cf0cc1403ee9a02d9f"),
            "game_id" : 4,
            "score_phrase" : "Great",
            "title" : "NHL 13",
            "url" : "/games/nhl-13/ps3-128181",
            "platform" : "PlayStation 3",
            "score" : 8.5,
            "genre" : "Sports",
            "editors_choice" : "N",
            "release_year" : 2012,
            "release_month" : 9,
            "release_day" : 11
        }
    ]
}